如何在PHP中使用字符串(也是俄语)匹配俄语单词?
例如,像这样:
$pattern = '/слово/';
preg_replace($pattern, $replacement, $string_in_russian)
我为$ pattern尝试了utf8_encode
和htmlentities
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(?=([^"]*"[^"]")[^"]*$)/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”,仍然没有)
答案 0 :(得分:7)
如果你做了一个真正的空白石板测试,你会发现俄罗斯没有任何问题 - 它实际上是破坏正则表达式的边界方面。
$glossary_search = '/'.$find_ru.'/iu'; // Works fine
$glossary_search = '/\b'.$find_ru.'\b/iu'; // Breaks
Word边界速记不支持UTF-8,因此,根据此问题:php regex word boundary matching in utf-8您可以尝试以下操作:
$glossary_search = '/(?<!\pL)'.$find_ru.'(?!\pL)/iu';
这在我的测试中运行良好。
答案 1 :(得分:1)
对于初学者,您必须确保您的php文件使用UTF-8编码。即使文件中没有任何UTF-8字符(它们可能从另一个文件传入),该文件必须是UTF-8才能使其内部的函数与UTF-8一起使用。
答案 2 :(得分:0)
<?php
$str = 'тест бла бла бла';
if(preg_match("'тест'isu", $str, $match))
{
echo $match;
}
?>
此外,preg_replace的示例:
<?php
$str = 'тест бла бла бла';
echo preg_replace("'бла'isu", '', $str);
?>