我需要有关此代码段的建议
$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字符串之间的,以便匹配中没有子字符串
再次感谢
答案 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);