为什么strpos返回不同的结果? - php

我有以下函数,可将特殊重音符(例如ă)转换为字符串中的a-zA-Z字符:

function tradu($sir){

        $sir_aux = $sir;

        $diacritice = array("ă"=>"a", "â"=>"a", "î"=>"i", "Î"=>"I", "ș"=>"s", "ş"=>"s", "ţ"=>"t", "ț"=>"t");

        for($i=0; $i<strlen($sir_aux); $i++){

            foreach($diacritice as $key=>$value){
                if($sir_aux[$i]==$key)
                    $sir_aux[$i]=$value;
            }
        }

        $sir_aux = strtr($sir, $diacritice);

        return $sir_aux;
    }   

假设a是原始字符串,而a_translated是转换后的字符串。

当我使用strpos(a, string_to_find)strpos(a_translated, string_to_find)时,返回的值是不同的。我还检查了strlen(a)strlen(a_translate),它们给出了不同的结果。
为什么会这样呢?

我需要这种解释,因为我需要搜索带有重音符号的字符串是否包含给定的普通字符串(不带重音符号),但是即使包含重音符号,我也必须从找到它的原始字符串中返回该部分。

我尝试了什么
我翻译原始字符串并找到searched_string开始的位置,然后我substr(ORIGINAL_STRING, position)。这是我注意到位置不对应的地方。

例:
原始字符串:Universitatea在2001年开设了一个娱乐场
搜索的字符串:infiintata
理想的结果:2001年宾夕法尼亚州的一个办公室。

参考方案

您从strpos获得的位置不正确,因为原始字符串是多字节的,而strpos无法处理多字节的字符串。尝试使用mb_strpos。

尝试:

mb_strpos(a,string_to_find,0,'UTF-8');

mb_strpos(a_translated,string_to_find,0,'UTF-8');

您将看到它们具有相同的结果。

请参阅以下代码,演示strpos(无法处理多字节字符串)和mb_strpos之间的区别:

$original_multibyte_string       = 'țată în  HERE';
$a_non_multibyte_str_same_length = '123456789HERE';
// HERE is on 10th (index 9 on array) character

echo 'strpos finds HERE in multibyte at: '.strpos($original_multibyte_string,'HERE').' '.'strpos finds HERE in non-multibyte at: '.strpos($a_non_multibyte_str_same_length,'HERE');
// OUTPUTS: strpos finds HERE in multibyte at: 12 strpos finds HERE in non-multibyte at: 9

echo "\n";
// now lets test the multibyte:

echo 'mb_strpos finds HERE in multibyte at: '.mb_strpos($original_multibyte_string,'HERE',0,'UTF-8').' '.'mb_strpos finds HERE in non-multibyte at: '.mb_strpos($a_non_multibyte_str_same_length,'HERE',0,'UTF-8');
// OUTPUTS: mb_strpos finds HERE in multibyte at: 9 mb_strpos finds HERE in non-multibyte at: 9

http://3v4l.org/ksYal

PHP:将数组值加在一起 - php

我相信这比标题听起来要难一些,但我可能完全错了。我有一个像这样的数组:[["londrina",15],["cascavel",34],["londrina",23],['tiradentes',34],['tiradentes',21]] 我希望能够采用通用…

PHP JQuery复选框 - php

我有以下片段。 var myData = { video: $("input[name='video[]']:checked").serialize(), sinopse: $("#sinopse").val(), dia: $("#dia").val(), quem: $(&#…

如何从php中获取datatables jQuery插件的json数据 - php

我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…