非ASCII情况下的正则表达式字边界

时间:2011-04-14 17:34:41

标签: php regex unicode

我的PHP脚本中有一个正则表达式,如下所示:

/(\b$term|$term\b)(?!([^<]+)?>)/iu

这与$ term中包含的单词匹配,只要前面或后面有单词边界,并且它不在HTML标记内。

但是,这在非ASCII情况下不起作用,例如俄语文本。有没有办法让它发挥作用?

我可以用

获得几乎同样好的结果
/(\s$term|$term\s)(?!([^<]+)?>)/iu

但这显然更有限,因为这个正则表达式是关于突出显示搜索词,所以它存在将空间包含在突出显示中的问题。

我已阅读this StackOverflow question about the problem,但它无效 - 无法正常工作。在该示例中,捕获是相反的方式(当我需要捕获搜索词时,捕获搜索词之外的文本)。

任何使这项工作的方法?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用zero-width lookahead/lookbehind assertions断言您所匹配的字母左右两边的字符是非字母吗?

答案 1 :(得分:0)

根据UTS#18的要求,\b肯定被定义为在Unicode上运行得非常好。你在说什么不干嘛?涉及的确切文本字符串是什么?