2010-04-27 60 views
0

在括号更换标签,甚至嵌套标签,与正则表达式

preg_replace('/\{[a-zA-Z.,\(\)0-9]+\}/', 'Replaced', 'Lorem ipsum dolor sit {tag1({tag2()})}, consectetur adipiscing elit.'); 

其结果是:

Lorem存有悲坐{TAG1(代替)},consectetur adipiscing ELIT。

问题

正如你可以看到“标签2”已经被替换,但我想替换“标签1” 难道有谁知道我能做到这一点?

(在某些情况下,它可能是这样的:{tag1({tag2({tag3()})})})等)

顺便说一句,我实际使用preg_replace_callback,但它更容易preg_replace

这里来显示它是一个网站,你可以测试代码:http://www.spaweditor.com/scripts/regex/index.php

+1

什么'something.something'和'在你的榜样print.print'之间的区别? – kennytm 2010-04-28 08:03:18

+1

通过“替换一切,但:something.something'”你的意思是,给定示例文本,从'preg_replace'返回的字符串应该是'something.something' ...或者你想要替换*大括号中的所有内容*与*第一个'something.something'风格值*? – salathe 2010-04-28 08:20:13

+0

结果应该是something.something其他所有的东西都必须被替换。 – christian 2010-04-28 17:23:38

回答

1

您需要为您的字符集添加大括号。下面是我使用的模式:

/\{[a-zA-Z.,\(\)\{\}0-9]+\}/ 

这里是结果:

"Lorem ipsum dolor sit Replaced, consectetur adipiscing elit." 
+0

坦克!,它的工作原理:)我现在几乎在那里我想。 你知道一个模式来替换除了something之外的所有东西吗?结果我得到了一些东西:{something.something({print.print(param1,param2)},param2)} something.something可以是:[a-zA -Z。] – christian 2010-04-27 19:44:10

1

一旦你开始谈论匹配嵌套的模式(例如:在类似(foo (bar) fu)内括号组匹配),则正则表达式是错误的工具。正则表达式是无状态的,在这种情况下,这意味着它们不能计算有多少个括号是开放的。

如果你正在寻找做这样的事情,你可能需要寻找到一个parser

+0

尽管纯正则表达式是正确的,但PHP中使用的PCRE支持递归匹配('(?R)')。 – kennytm 2010-04-28 20:25:19