我有以下函数将特殊重音字符(如ă)转换为字符串中的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;
}
Run Code Online (Sandbox Code Playgroud)
假设a是原始字符串,a_translated是翻译后的字符串.
当我使用strpos(a, string_to_find)和时strpos(a_translated, string_to_find),返回的值是不同的.我也检查了strlen(a),strlen(a_translate)他们给出了不同的结果.
为什么会这样?
我需要这个解释,因为我需要搜索带有重音的字符串是否包含给定的普通字符串(没有重音符号),但我必须从原始字符串返回该部分,即使它包含重音符号也是如此.
我尝试了什么我
翻译原始字符串并找到search_string开始的位置,然后我substr(ORIGINAL_STRING, position).这是我注意到位置不对应的地方.
例如:原来的字符串:Universitatea一个FOST înfiinţată在2001年pentru一个oferi ...搜索的字符串:infiintata期望的结果:înfiinţată 2001年pentru一个oferi ...
您获得的位置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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |