str_ireplace不能处理非ASCII字符。

3

我需要在俄语文本中突出显示搜索结果,但是当查询具有不同大小写时,str_ireplace() 就无法正常工作。我已经尝试了手册中的所有方法manual,但没有任何效果。这是我尝试过的内容:

<?php
setlocale (LC_ALL, 'ru_RU');
$query = 'ПрОбЛеМа';
$result = 'Эта проблема нам не знакома.';

$result = str_ireplace($query, "<strong>$query</strong>", $result); // does not work
$result = preg_replace("/($query)/i", '<strong>$1</strong>', $result); // does not work
$result = mb_eregi_replace("$query", "<strong>$query</strong>", $result); // does not work
$result = ext_str_ireplace($query, "<strong>$query</strong>", $result); // from php.net - does not work
$result = highlightStr($result, $query); // from php.net - does not work

?>

有没有办法让它工作?我现在感到绝望。

PHP 5.3.3

3个回答

3
如果你在 preg_replace 函数中添加 "u" (unicode) 修饰符,它应该可以正常工作。
 $result = preg_replace("/(".preg_quote($query).")/iu", '<strong>$1</strong>', $result);

此外,您需要在正则表达式模式中引用特殊字符。

1
哇,这太厉害了!我真想为此请你喝一杯啤酒! - Silver Light
不错的猜测,因为非ASCII并不自动意味着Unicode;-) - Álvaro González
2
@Álvaro G. Vicario,我猜我成长在一个充满阳光的世界里,在这个世界中,默认情况下非ASCII意味着Unicode。我的错,没有提到它 :) - Silver Light

3
你可以使用mb_eregi_replace,如果你使用的是非ASCII/多字节字符。请删除"

"。
$result = mb_eregi_replace($query, "<strong>$query</strong>", $result);

您还可以设置编码:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

如何在不使用正则表达式的情况下解决这个问题 y?假设指针所指向的行中的字符寄存器不能被更改! - Aliskin

1

即插即用替换:

function mb_str_ireplace ($search, $replace, $subject, &$replacements) 
{
    return preg_replace("/$search/ui", $replace, $subject, -1, $replacements);
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接