2012-02-10 95 views
2

之間除了考慮以下字符串:過濾號碼,當他們花括號

$text = "Dat foo 13.45 and $600 bar {70} and {8}"; 

我需要標註的所有號碼在$文本,除非他們是花括號之間進行。我現在有這樣的:

echo preg_replace("([0-9]+(?:\.[0-9]+)?)","{NUMBER:$0}",$tweet); 

,其輸出:

Dat foo {NUMBER:13.45} and ${NUMBER:600} bar {{NUMBER:70}} and {{NUMBER:8}} 

然而,所期望的輸出是:

Dat foo {NUMBER:13.45} and ${NUMBER:600} bar {70} and {8} 

其中之間的數{和}被忽略。是否有可能擴大正則表達式來忽略大括號或是另一個需要的解決方案?

任何幫助,將不勝感激:-)

+3

你可以通過接受答案來表達你的感激之情。還要考慮調查語法。這是你連續第四個plzsendtehregex問題;具體查找的語法已經向您解釋過。 - SA:[開源RegexBuddy替代品](http://stackoverflow.com/questions/89718/is-there)和[在線正則表達式測試](http://stackoverflow.com/questions/32282/regex-testing)爲工具,或[RegExp.info](http://regular-expressions.info/)爲教程。 – mario 2012-02-10 21:41:52

回答

3

嘗試使用lookaheads/lookbehinds沒有{}於查找號碼。

注意:確保將您的正則表達式包含在分隔符中(例如/)。

echo preg_replace("/(?<!{)([0-9]+(?:\.[0-9]+)?)(?!})/","{NUMBER:$0}",$tweet); 

DEMO:http://codepad.org/7ai0px2i

(?<!{)表示 「不是由前面{」 和(?!})裝置 「後面沒有}」。

+0

這太好了 - 它幾乎可以工作:)但是,如果對於$ tweet =「foo 40 bar {baz40}」,它不會。輸出爲「foo {NUMBER:40} bar {baz {NUMBER:4} 0}」。換句話說:它只是忽略大括號之間的數字,但如果數字旁邊的大括號之間有其他字符則不會。是否有可能使正則表達式忽略大括號之間的所有*,因此在本例中,輸出將是foo {NUMBER:40} bar {baz40}? – Pr0no 2012-02-10 22:59:24

+0

@Reveller:我不確定。因爲lookbehinds需要是固定的長度。你可以使用'preg_replace_callback'而不是lookarounds,然後在回調中檢測它是否在花括號中。 – 2012-02-11 17:20:48