编号匹配组的问题&替换

时间:2014-02-15 12:19:16

标签: php regex

好的,所以这是交易......

我正在尝试解析这个问题:

[time_zone] => [[Central European Time|CET]]
[utc_offset] => +1
[time_zone_DST] => [[Central European Summer Time|CEST]]
[utc_offset_DST] => +2
[drives_on] => right
[calling_code] => [[Telephone numbers in Italy|39]]
[cctld] => [[.it]]

简而言之,我正在尝试将[[X]]替换为X,将[[Anything|X]]替换为X

这就是我提出的正则表达式:

(?:\[\[(?:[^\|]+)\|([^\|\]]+)\]\])|\[\[(.+)?\]\]

这看起来很好。

所以,我想这样做:

preg_replace("/$mypattern/","$1",$mystring);

但是,这里有一个问题:

匹配[[X]]时,捕获的群组为$2。 而在另一种情况下,它是$1

解决这个问题最优雅的方法是什么?

1 个答案:

答案 0 :(得分:1)

嗯...像往常一样,我想出了一个解决方案,几秒钟之后我已经在SO中发布了这个问题...大声笑。

所以,解决方案就是改变正则表达式(是的,现在捕获的组总是$1) - 更新

\[\[(?:(?:[^\]]+)?\|)?([^\]]+)?\]\]

PS 我仍然有兴趣知道上面的正则表达式是否有解决方法(我的意思是没有必须改变它,和/或诉诸复杂preg_match_all事物等)