SKIP-FAIL正则表达式具有多种模式,可在一个PCRE正则表达式中忽略

时间:2019-04-02 08:20:48

标签: php regex

我试图将一个字符串替换为另一个字符串,但前提是该字符串必须用双引号或单引号引起来。 我可以打双打,但是我也很难包括单打。

我将preg_repalce与array一起使用,因为我还有其他适用于字符串的规则。

$text = <<<DATA
I love php
"I love php"
'I love php'
"I" love 'php'
DATA;

$text = preg_replace(
    [
     '/"[^"]*"(*SKIP)(*FAIL)|\blove\b/i'
    ],
    [
     'hate'
    ],
    $text
);

echo $text;

输出为

I hate php     -> OK
"I love php"   -> OK
'I hate php'   -> NOT OK
"I" hate 'php' -> OK

我的问题是单引号

2 个答案:

答案 0 :(得分:3)

或者,您也可以使用捕获组来捕获单引号或双引号,并使用反向引用来匹配相同的引号:

$re = '/([\'"]).*?\1(*SKIP)(*F)|\blove\b/';

RegEx Demo

PHP代码:

$re = '/([\'"]).*?\1(*SKIP)(*F)|\blove\b/';
$text = preg_replace($re, 'hate', $text);

Code Demo

答案 1 :(得分:2)

您需要分组要跳过的内容,并在使用单引号的字符串文字时转义单引号:

'/(?:\'[^\']*\'|"[^"]*")(*SKIP)(*FAIL)|\blove\b/i'
  ^^^          ^       ^

请参见regex demo

现在,(*SKIP)(*FAIL)将同时适用于\'[^\']*\'"[^"]*"这两个选择。