RegEx:在“AB ABC D”中匹配和替换ABC

时间:2009-02-08 13:10:24

标签: php regex preg-replace

我需要有关此代码段的建议

$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);

这将匹配“AB ABC D”中的ABC,并将其替换为“AB fooBbar D”;你可以看到这与开头的“AB”部分匹配,我必须在$ 1的替换字符串中重复,以免丢失它。

这是获得这样结果的最佳方法吗?

是否有标志X

$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text); 

会产生相同的结果吗?

我希望我一直很清楚

谢谢!

编辑:将A,B,C视为任意字符的原子字符串,它们也可以包含空格

此外,提供的示例实际上是错误的,因为它只匹配“ABC ABC”中的第二个“ABC”。

EDIT2 :对不起,我可能已经非常严重地解释了这个问题。关键是我想要匹配两个A,C字符串之间的,以便匹配中没有子字符串

再次感谢

3 个答案:

答案 0 :(得分:1)

这个怎么样:

$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);

\S匹配非空白字符,因此您不会替换不同的字词。


在看到OP的一些评论之后,我会冒另一个猜测:

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);

答案 1 :(得分:1)

使用*量词的非贪婪版本:

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);

答案 2 :(得分:0)

问题已经澄清,请尝试以下表达式:

preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)

一个例子:

$A = 'abc'; $B = '123'; $C = 'xyz';
$text = "$A$B$C $A$A$B$C $A$B$C$C";
echo preg_replace("/(?:$A)+(.+?)(?:$C)+/", 'foo$1bar', $text);