php - 如何在 PHP 中使用 preg_replace 匹配俄语单词?

标签 php regex utf-8 internationalization preg-replace

如何在 PHP 中匹配字符串(也是俄语)中的俄语单词?

例如这样的事情:

$pattern = '/слово/';
preg_replace($pattern, $replacement, $string_in_russian)

我试过了 utf8_encodehtmlentities为 $pattern 使用 UTF-8 标志,但它没有用。我还应该对 $string_in_russian 进行编码吗?

更新:/u 标志的建议没有用,所以我放置了我需要它的实际代码。它来自 Wordpress 的词汇表插件(我的网站已正确设置为使用俄语,它确实有效,但在本例中无效)。所以这是代码

$glossary_title = $glossary_item->post_title;
$glossary_search = '/\b'.$glossary_title.'s*?\b(?=([^"]\*"[^"]\*")\*[^"]*$)/iu';
$glossary_replace = '<a'.$timestamp.'>$0</a'.$timestamp.'>';
$content_temp = preg_replace($glossary_search, $glossary_replace, $content, 1);

当我对 HTML 注释进行快速回显时,这是我为模式获得的字符串类型
/\bсловоs*?\b(?=([^"]*"[^"]<em>")</em>[^"]*$)/iu

好吧,这似乎仍然行不通。我想也许是“s”把我搞砸了(这个级别的正则表达式有点超出我的范围,但我认为它存在于可能的复数形式中),但删除它没有帮助。

更新 #2: 好吧,所以我决定做一个完整的“白板”测试 - 纯 PHP 文件,其中包含一些英语和俄语的 $content 字符串以及要替换的目标词。这是代码

$content_en = 'Nulla volutpat pretium nunc, ac feugiat neque lobortis vitae. In eu sapien sit amet eros tincidunt viverra. <b style="color:purple">Proin</b> congue hendrerit felis, et consequat neque ultrices lobortis. <b style="color:purple">Proin</b> luctus bibendum libero et molestie. Sed tristique lacus a urna semper eget feugiat lacus varius. Donec vel sodales diam. <b style="color:purple">Proin</b> fringilla laoreet purus, a facilisis nisi porttitor vel. Nullam ac justo ac elit laoreet ullamcorper vel a magna. Suspendisse in arcu sapien.';
$find_en = 'proin';
$replace_with_en = '<em style="color:red">REPLACEMENT</em>';
$glossary_search = '/\b'.$find_en.'s*?\b(?=([^"]*"[^"]*")*[^"]*$)/iu';
$content_en_replaced = preg_replace($glossary_search, $replace_with_en, $content_en);

$content_ru = 'Lorem Ipsum используют потому, что тот обеспечивает более или менее стандартное заполнение шаблона, а также реальное распределение букв и пробелов в абзацах, которое не получается при простой дубликации "Здесь <b style="color:purple">ваш</b> текст.. Здесь <b style="color:purple">ваш</b> текст.. Здесь <b style="color:purple">ваш</b> текст.." Многие программы электронной вёрстки и редакторы HTML используют Lorem Ipsum в качестве текста по умолчанию.';
$find_ru = 'ваш';
$replace_with_ru = '<em style="color:red">Многие</em>';
$glossary_search = '/\b'.$find_ru.'s*?\b(?=([^"]*"[^"]*")*[^"]*$)/iu';
$content_ru_replaced = preg_replace($glossary_search, $replace_with_ru, $content_ru);

这是输出的屏幕截图 http://www.flickr.com/photos/iliadraznin/5372578707/

如您所见,英语文本替换了目标词,而俄语文本没有替换,代码是相同的,我使用的是/u 标志。该文件也是 UTF-8 编码的。有什么建议么? (又一次,我尝试删除“s”,仍然没有)

最佳答案

如果您进行真正的空白测试,您会发现俄语没有任何问题 - 实际上是单词边界方面破坏了正则表达式。

$glossary_search = '/'.$find_ru.'/iu'; // Works fine
$glossary_search = '/\b'.$find_ru.'\b/iu'; // Breaks

单词边界简写不是 UTF-8 识别的,所以,根据这个问题:php regex word boundary matching in utf-8您可以尝试以下操作:

$glossary_search = '/(?<!\pL)'.$find_ru.'(?!\pL)/iu';

这在我这里的测试中运行良好。

关于php - 如何在 PHP 中使用 preg_replace 匹配俄语单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4739880/

相关文章:

php - 相当于PHP的Java Webservice Client UsernameToken

c# - 查找指定函数的字符串文字参数

regex - 数据框列向量操作

c# - 如何在 C#.Net 中获取编码为 UTF-8 的 CSV 文件?

php - 同一个表上的两个 SUM() 查询但使用不同的 where 子句

php - 如何设置默认的php header()

php - 如何从 PHP 中的选择查询中获取列名?

javascript - 手机号码验证(国际)

python - 如何在 Python 中将字符串转换为 utf-8

javascript - 在从 Node 到 Java 的调用中强制执行 utf8 编码