【问题标题】:PHP PCRE regex with multiple SKIP FAIL in a patternPHP PCRE 正则表达式在一个模式中有多个 SKIP FAIL
【发布时间】:2017-11-11 17:27:08
【问题描述】:

我有一个简单的字符串:

$string = '--#--%--%2B--';

我想对所有字符(包括“孤独”%)进行百分比编码,- 字符和%xy 形式的三元组除外。所以我写了以下模式替代方案:

$pattern1 = '/(?:[\-]+|%[A-Fa-f0-9]{2})(*SKIP)(*FAIL)|./us';
$pattern2 = '/(?:[\-]+)(*SKIP)(*FAIL)|(?:%[A-Fa-f0-9]{2})(*SKIP)(*FAIL)|./us';

请注意(多个)(*SKIP)(*FAIL)(?:) 的使用。

匹配和替换的结果是一样的——也是正确的:

--%23--%25--%2B--

我想问一下:

  • 这两种模式是否等效?如果不是,那么哪一个最适合用于 url 编码?请用几句话解释一下,为什么?
  • 您会建议其他替代方案(暗示回溯控制动词),还是我的模式是一个不错的选择?
  • 我可以在整个(选择的)模式周围只应用一个(?:),即使(多个)(*SKIP)(*FAIL) 将在其中吗?

我知道我一次问更多问题,对你的要求有点过分。请接受我的道歉!非常感谢。


P.S:我已经使用以下 PHP 代码进行了测试:

$result = preg_replace_callback($patternX, function($matches) {
    return rawurlencode($matches[0]);
}, $string);
echo $result;

【问题讨论】:

  • 这些模式是基于我以前的建议(所以,是的,一个不错的选择:))。它们都可以工作,但如果你不量化它,你根本不需要分组结构,内部也没有任何交替,从第二个模式中删除 (?:...),因为它们是多余的。
  • @WiktorStribiżew 事实上,我的模式是基于你的建议。再次感谢 - 我很高兴你给了我这个选项!我觉得它很优雅,所以我研究和研究了它。不幸的是,在任何地方都找不到多个跳过失败...通过分组构造,您的意思是(?:),对吗?如果是这样的话:如果我选择模式 1(有点容易理解),我应该保留 (?:),因为里面有一个交替,对吧?如果我选择模式 2,我应该删除两个 (?:),因为它们内部没有交替,对吧?...
  • @WiktorStribiżew ...你能告诉我,你会推荐哪一个?非常感谢你。 P.S:你也会写一个答案吗?太好了,因为其他用户也会从您的建议中受益。
  • 你是对的。使用其中任何一个。但是关于答案,this 不是 真正的 答案吗?
  • @aendeerei:要清楚,你可以这样做:$result = rawurlencode(rawurldecode($str));

标签: php regex encoding pattern-matching pcre


【解决方案1】:

首先,这两种模式都利用了 SKIP-FAIL PCRE 动词序列,这是一个众所周知的“技巧”来匹配某些文本并跳过它。有关更多详细信息,请参阅How do (*SKIP) or (*F) work on regex?

这两种模式产生相同的结果,(?:[\-]+|%[A-Fa-f0-9]{2})(*SKIP)(*FAIL) 匹配 [\-]+%[A-Fa-f0-9]{2} 然后跳过匹配,(?:[\-]+)(*SKIP)(*FAIL)|(?:%[A-Fa-f0-9]{2})(*SKIP)(*FAIL) 首先尝试匹配 [\-]+ 如果找到则跳过它,然后尝试匹配%[A-Fa-f0-9]{2},如果找到则跳过匹配。第二种模式中的(?:...) 非捕获组是多余的,因为内部没有交替并且组没有被量化。您可以在模式中使用任意数量的(*SKIP)(*FAIL),只需确保在| 之前使用它们以跳过相关匹配。

SKIP-FAIL 技术用于当您想要匹配特定上下文中的某些文本时,当一个字符应该被跳过/“避免”时,如果它在 并且 后跟一些字符,或者当您需要“避免”匹配整个字符序列,就像在这种情况下一样,因此,SKIP-FAIL 很好用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多