我需要这个片段的建议

$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柱之间,所以不存在子甲在匹配

再次感谢

有帮助吗?

解决方案

作为问题已经澄清,尝试此表达式:

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);

其他提示

这样如何:

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

\S匹配的非空白字符,这样就不会跨越不同的单词替换。


看到一些OP的意见后,我就斗胆另一种猜测:

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

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

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top