Ili*_*nin 7 php regex utf-8 preg-replace internationalization
我如何在PHP中使用字符串(也是俄语)匹配俄语单词?
例如,像这样的事情:
$pattern = '/?????/';
preg_replace($pattern, $replacement, $string_in_russian)
Run Code Online (Sandbox Code Playgroud)
我试着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);
Run Code Online (Sandbox Code Playgroud)
当我快速回复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);
Run Code Online (Sandbox Code Playgroud)
这是输出的截图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
Run Code Online (Sandbox Code Playgroud)
单词边界速记不是UTF-8识别的,所以,根据这个问题:在utf-8中使用php正则表达式单词边界匹配你可以尝试以下方法:
$glossary_search = '/(?<!\pL)'.$find_ru.'(?!\pL)/iu';
Run Code Online (Sandbox Code Playgroud)
这在我的测试中工作正常.
| 归档时间: |
|
| 查看次数: |
2981 次 |
| 最近记录: |