2012-02-10 97 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