使用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.
在实际操作中,我需要的输入输出序列是:
- 输入:创建一件白色衬衫
输出:制作一件白衬衫。
- 输入:"创建一件白衬衫。"
输出:"创建白衬衫"
- input:hello创建一些好的代码
输出:你好,制作一些好的代码。
- 输入:"你好"制作一些"好"的代码。"
输出:"你好"制作一些"好"的代码。"
谢谢大家!
编辑:我想做一些类似的事情:如果有一个开场白,在这种情况下,在匹配关键字create
之前,确保它有一个结束对。希望这是合理的,也是可能的。
您不需要任何条件构造来跳过引号中的内容。有两种方法。
使用与引用的子字符串匹配的备用分支,并使用(*SKIP)(*FAIL)
动词:
preg_replace('/"[^"]*"(*SKIP)(*F)|creat(?:e|ing)/i', 'make', $input)
图案详细信息:
"[^"]*"
-匹配"
,然后是除"
之外的0+个字符,然后是"
(*SKIP)(*F)
-使正则表达式引擎放弃当前匹配的文本并从当前索引继续|
-或creat(?:e|ing)
-匹配create
或creating
参见演示
另一种方法是仅使用捕获和使用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)
-匹配create
或creating
注意,"[^"]*"
是一个示例正则表达式,如果需要将C字符串与转义序列相匹配,则至少应使用"[^"'''']*(?:''''.[^"'''']*)*"
(在代码中)。