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

如何在PHP中使用preg_replace匹配俄语单词?,php,regex,utf-8,internationalization,preg-replace,Php,Regex,Utf 8,Internationalization,Preg Replace,如何在PHP中匹配字符串中的俄语单词(也是俄语) 举个例子: $pattern = '/слово/'; preg_replace($pattern, $replacement, $string_in_russian) 我尝试使用UTF-8标志对$pattern进行utf8\u编码和htmlentities,但没有成功。我是否也应该用俄语对$string_进行编码 更新:对/u标志的建议不起作用,所以我将实际的代码放在这里。它来自Wordpress的词汇表插件(我的站点正确设置为使用俄语,它确

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

举个例子:

$pattern = '/слово/';
preg_replace($pattern, $replacement, $string_in_russian)
我尝试使用UTF-8标志对$pattern进行
utf8\u编码
htmlentities
,但没有成功。我是否也应该用俄语对$string_进行编码

更新:对/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);
$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);
当我快速回显到HTML注释中时,这就是我为模式获取的字符串类型
/\bСааааs*?\b(?=([^”]*“[^”]”[^”]”[^”]*$)/iu

好吧,这似乎仍然不起作用。我想可能是“s”把我搞糊涂了(这个级别的正则表达式我有点不懂,但我想它是为可能的复数而存在的),但删除它并没有帮助

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

$glossary_title = $glossary_item->post_title;
$glossary_search = '/\b'.$glossary_title.'s*?\b(?=([^"]\*"[^"]\*")\*[^"]*$)/iu';
$glossary_replace = '&lt;a'.$timestamp.'&gt;$0&lt;/a'.$timestamp.'&gt;';
$content_temp = preg_replace($glossary_search, $glossary_replace, $content, 1);
$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);
$content\u en='Nulla volatium pretium nunc,ac feugiat neque lobortis vitae.在欧盟的智者中,坐着的是一个充满活力的人。Proin congue hendrerit felis,et consequeat neque ultrices lobortis.Proin luctus bibendum libera and molestie.Sed tristique lacus a urna semper eget feugiat varius.Donec vel sodales diam.Proin fluilla laoreet p乌鲁斯,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂,一家工厂;
$find_en='proin';
$replace_with_en=‘REPLACEMENT’;
$glossary_search='/\b'.$find_en.*s*?\b(?=([^“]*”[^“]*”)*[^“]*”)/iu';
$content_en_replaced=preg_replace($glossary_search,$replace_with_en,$content_en);
$contentзru='Lorem Ipsumзззззззззззззаа、жжзза, которое не получается при простой дубликации "Здесь ваш текст.. Здесь ваш текст.. Здесь ваш текст.."莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼·莫扎里尼;
$find_ru='ofааа';
$replace_为_-ru='Мццццццц';
$glossary_search='/\b'.$find_ru.*?\b(?=([^“]*”[^“]*”)*[^“]*”)/iu';
$content_ru_replaced=preg_replace($glossary_search,$replace_with_ru,$content_ru);
这是输出的屏幕截图


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

对于初学者,您必须确保您的php文件使用UTF-8编码。即使文件中没有任何UTF-8字符(它们可能是从另一个文件传入的),文件必须是UTF-8,文件中的函数才能与UTF-8一起工作。

如果你做一个真正的空白板测试,你会发现俄语没有问题-实际上是单词边界方面打破了正则表达式

$glossary_search = '/'.$find_ru.'/iu'; // Works fine
$glossary_search = '/\b'.$find_ru.'\b/iu'; // Breaks
单词边界速记不支持UTF-8,因此,根据这个问题:您可以尝试以下方法:

$glossary_search = '/(?<!\pL)'.$find_ru.'(?!\pL)/iu';
PCRE regexp中的“u”选项提供Unicode,因此:

<?php
  $str = 'тест бла бла бла';
  if(preg_match("'тест'isu", $str, $match))
  {
    echo $match;
  }
?>

我检查过了,它是UTF-8,至少当我将它保存在记事本++中时是这样。整个网站在俄语中工作得很好-URL、永久链接,我可以搜索,见鬼,甚至YARP插件似乎也可以工作。它应该只是正则表达式中的语法问题,缺少或不正确的东西。-/你能发布一个传递表达式的字符串吗?在ASCII中,例如,为了排除编码。通过“传递表达式”你的意思是有效吗?任何英语单词都有效,至少是我尝试过的少数几个-如果它在$content中,它会找到它并用$glossary\u replace替换。我只对俄语单词有问题。所以“/\bwords*?\b(?=([^”]*“[^”]”[^”]“[^”]*)/I”works你想用这个正则表达式捕获什么?我很好奇,因为我把你的脚本简化了,所以它就是
$glossary\u search='/'.$find\u ru./iu';
,而且很有效。老实说,我不知道:)这是一个取自wordpress词汇表插件的脚本。我不是正则表达式方面的专家,所以我认为这是必要的,也许是为了解释潜在的html标记,或者格式化标记,或者类似的东西。我从没想过这和单词边界有关。谢谢似乎表达式的其余部分((?=([^“]*”[^“]*”*[^“]*$)打破了它,但我可以根据语言使用不同的表达式,所以这应该不是问题。通过
\b
的单词边界实际上与
相同(?:(?\b
相同)(?:(?\w
要匹配Unicode字母属性,必须改用
[\pL\pM\p{Nl}]
;否则它还匹配十进制数和连接器标点。要使
\w
在Java中正确工作,需要
[\pL\pM\p{Nd}\p{Nl Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&\p{So}]
,但是你不能在php中使用连接字符类。但是你可能没有尾随位,所以只要
[\pL\pM\p{Nd}\p{Nl}\p{Pc}]
。这意味着
\b
必须是
(?:)游说以纠正这个疏忽!在苏联,俄语单词regex与你匹配!