0

我需要关于这个片段的建议

$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 字符串之间的任何内容,以便匹配中没有子字符串 A

再次感谢

4

3 回答 3

1

这个怎么样:

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

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


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

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);
于 2009-02-08T13:18:33.223 回答
1

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

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);
于 2009-02-08T13:22:01.500 回答
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);
于 2009-02-08T13:25:47.470 回答