2011-04-14 69 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