【问题标题】:SKIP-FAIL regex with multiple patterns to ignore in one PCRE regex在一个 PCRE 正则表达式中忽略多个模式的 SKIP-FAIL 正则表达式
【发布时间】:2019-04-02 08:20:47
【问题描述】:

我试图用另一个字符串替换一个字符串,但前提是它没有双引号或单引号。 我可以为双打做,但我也有问题要包括单打。

我将 preg_repalce 与数组一起使用,因为我还有其他规则可应用于字符串。

$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

我的问题是单引号

【问题讨论】:

标签: php regex


【解决方案1】:

作为替代方案,您还可以使用捕获组来捕获单引号或双引号,并使用反向引用来匹配相同的引号:

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

RegEx Demo

PHP 代码:

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

Code Demo

【讨论】:

    【解决方案2】:

    当您使用单引号字符串文字时,您需要分组您想要跳过并转义单引号的备选方案:

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

    请参阅regex demo

    现在,(*SKIP)(*FAIL) 将同时适用于 \'[^\']*\'"[^"]*"

    【讨论】:

    • 完美,但现在我有第二个问题,如果总字符串包含在单引号或双引号内,例如:code'$text = &lt;&lt;&lt;DATA "I love php "I love php" 'I love php' "I" love 'php'" DATA;code`
    • @Robert 你在这里期望什么匹配?
    • 我希望不考虑包含初始字符串的引号(这里也是双引号或单引号),因此结果是相同的。如果可能...
    • @Robert 这不是 100% 的故障保险,但请尝试 (?:^["']|["']$|\'[^\']*\'|"[^"]*")(*SKIP)(*FAIL)|\blove\b,请参阅 demo。请注意,最初的 ^["']["']$ 不检查相应的结束/开始报价。
    • 从第一次测试开始,它似乎有效,您认为它可能会出现什么问题,在这种情况下,它可能不是 100% 故障安全
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多