PHP中的条件正则表达式;似乎不起作用


Conditional regex in PHP doesn't seem to work

使用preg套件在PHP中执行正则表达式匹配,我知道您可以在regex中表示条件语句。

我在网上几乎找不到任何文档,所以我求助于Jeffrey E.F.Friedl的《掌握正则表达式》。

在我看来,像/(?(?<=NUM:)'d+|'w+)/这样的东西,当它前面有NUM:时,应该与数字匹配,否则应该与单词匹配。

但出于某种奇怪的原因,它总是返回true,匹配数据对我来说也没有意义。有人能向我解释一下发生了什么事吗?

我想做的是:

preg_replace('/creat(?:e|ing)/i', 'make', $input)
but only when '/creat(?:e|ing)/i' is not surrounded by quotes.

在实际操作中,我需要的输入输出序列是:

  1. 输入:创建一件白色衬衫

输出:制作一件白衬衫。

  1. 输入:"创建一件白衬衫。"

输出:"创建白衬衫"

  1. input:hello创建一些好的代码

输出:你好,制作一些好的代码。

  1. 输入:"你好"制作一些"好"的代码。"

输出:"你好"制作一些"好"的代码。"

谢谢大家!

编辑:我想做一些类似的事情:如果有一个开场白,在这种情况下,在匹配关键字create之前,确保它有一个结束对。希望这是合理的,也是可能的。

您不需要任何条件构造来跳过引号中的内容。有两种方法。

使用与引用的子字符串匹配的备用分支,并使用(*SKIP)(*FAIL)动词:

 preg_replace('/"[^"]*"(*SKIP)(*F)|creat(?:e|ing)/i', 'make', $input)

图案详细信息:

  • "[^"]*"-匹配",然后是除"之外的0+个字符,然后是"
  • (*SKIP)(*F)-使正则表达式引擎放弃当前匹配的文本并从当前索引继续
  • |-或
  • creat(?:e|ing)-匹配createcreating

参见演示

另一种方法是仅使用捕获和使用preg_replace_callback,在那里您可以检查组是否匹配(并适当地基于替换逻辑):

 preg_replace_callback('/("[^"]*")|creat(?:e|ing)/i', function($m) {
     return !empty($m[1]) ? $m[1] : 'make';
 }, $input)

查看IDEONE演示

图案详细信息

  • ("[^"]*")-组1(以后可以用替换模式中的$1引用)-双引号字符串
  • |-或
  • creat(?:e|ing)-匹配createcreating

注意,"[^"]*"是一个示例正则表达式,如果需要将C字符串与转义序列相匹配,则至少应使用"[^"'''']*(?:''''.[^"'''']*)*"(在代码中)。