2011-04-14 71 views
2

我有我的PHP脚本像这样的正则表达式:非ASCII的情况下正则表达式字边界

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

这包含在$期限匹配单词,只要有之前或之后和单词边界它不在HTML标签内。

然而,这并不非ASCII情况下工作,例如与俄文本。有没有办法让它工作?

我可以得到几乎一样好结果与

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

但这显然更加有限,因为这个正则表达式是关于突出搜索词,它包括在高亮的空间的问题。

我读过this StackOverflow question about the problem,但它并不能帮助 - 无法正常工作。在那个例子中,捕获是相反的方式(当我需要捕获搜索词时,捕获搜索词以外的文本)。

什么办法,使这项工作?谢谢!

回答

0

你可以使用zero-width lookahead/lookbehind assertions断言的字符以你匹配什么的左边和右边都是非信吗?

+0

谢谢。我结束了这个: /(?<=[\s.,;:]]((term)(?!([^ <]+)?>)/ iu 它工作得很好,但我该怎么做另一个我试过 (?<= [\ s。,;:])($ term | $ term)(?= [\ s。,;:])(?!([^ <]+)?>)/ iu 但这不起作用嗯,这并不重要 - 我甚至不确定匹配出现在单词末尾的术语是个好主意 – 2011-04-15 03:54:38

0

\b肯定定义为Unicode的很好的工作,如由UTS#18必需的。你在说什么没有做?什么是确切的文本字符串?

+0

代码来自WordPress搜索插件,如果搜索词不完全在另一个词的内部(而不是在HTML标签内),则应搜索所有搜索词的所有发生。 – 2011-04-15 03:36:26

+0

从本文中,搜索“програ”与正确匹配“\bпрогра|програ\ b “。 програВопредлагаюэлектроннойтам。 Сталлучшеплатформумытам,рукипринятьньюпо,работемешаютдниза.програСпольскипрограммыбезусловноихбез。 Триможетобычнобы,большеразныевыгде。 Дветобудучёртовфактически,работатьпреодолетьпоко。 Томвнешнихзакончитьбезответственныйты。 Кремнияпрограэлектпрограроннойневсю,томдодураккоманды。 Обтдвашихпрограммировать,нонасинтервьюпроцессорах。 – 2011-04-16 05:49:12

+0

@Mikko,我相信我知道发生了什么事情。我只是尝试使用Perl,它应该与PHP中的preg匹配相同。以下是该协议:**当且仅当**您将字符串和模式存储为UTF-8时,它正确匹配,但如果这些文字被视为字节而不是字符,则相同模式无法匹配。在Perl中,您只需在程序的顶部说'use utf8;',然后所有的字符串操作符(包括匹配)就可以很好地与这些UTF-8文字一起工作。 (我们没有两种口味的操作。)但如果你*不这样做,它会“神秘地”失败。这可能是你的问题吗? – tchrist 2011-04-16 06:35:22