【问题标题】:RegEx: matching and replacing ABC in "AB ABC D"RegEx:匹配和替换“AB ABC D”中的ABC
【发布时间】:2009-02-08 13:10:24
【问题描述】:

我需要关于这个 sn-p 的建议

$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:对不起,我可能对问题的解释很糟糕。关键是我想匹配 whatever 在两个 A、C 字符串之间,这样匹配中就没有子字符串 A

再次感谢

【问题讨论】:

  • 下一次,你应该想出一个真实的例子。 :-) 那些虚构的“ABC”示例并不理想(如您所见)。
  • “A AABCC C”的期望输出应该是什么?
  • @NoWhereMan:你能解释一下为什么简单的 preg_replace('|A(B)C|', 'foo$1bar', $text) 不起作用吗?
  • @Tomalak:是的,你是对的,我很抱歉@Zach:A AABCC C 应该返回“A AfooBbarC C”或“A AfooBBCC bar”
  • @Zach: B 可能包含 A

标签: php regex preg-replace


【解决方案1】:

这个怎么样:

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

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


在看过一些OP的cmets之后,我会冒险另一个猜测:

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

【讨论】:

  • 很好,但我也需要匹配空格,我的意思是 ABC 是任意的 A、B、C 字符串,我应该更好地解释一下。
【解决方案2】:

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

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

【讨论】:

  • 我试过了,它匹配“AABC”中的 AABC,而不仅仅是 ABC
【解决方案3】:

既然问题已经澄清,试试这个表达:

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

【讨论】:

  • A(.+?)C 也匹配 A C B C,并且 [^C] 它不合适,因为 C 实际上是一个字符串(例如,它可能是 'foo');抱歉,我可能在你给出答案时编辑了描述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多