【发布时间】: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