正则表达式:匹配和在“AB ABC d”代替ABC
-
22-08-2019 - |
题
我需要这个片段的建议
$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);
不隶属于 StackOverflow