有没有办法使用preg_quote
并忽略命名的子模式被转义? 例如:转义字符串包含与preg_quote命名子模式
/login/?next=(?P<next_url>.*)
将逃到
\/login\/\?next\=(?P<next_url>.*)
,而不是
\/login\/\?next\=\(\?P\<next_url\>\.\*\)
感谢
有没有办法使用preg_quote
并忽略命名的子模式被转义? 例如:转义字符串包含与preg_quote命名子模式
/login/?next=(?P<next_url>.*)
将逃到
\/login\/\?next\=(?P<next_url>.*)
,而不是
\/login\/\?next\=\(\?P\<next_url\>\.\*\)
感谢
我已经实现我自己的功能做了一个解决办法:
protected function escapeUrlPattern($pattern) {
$chars = array('/', '=', '-', '.', '\\', '+', '*', '?', '^', '$', '{', '}', '!', '<', '>', '|', ':',);
$patternChars = str_split($pattern);
$idle = false;
$escapedPattern = "";
foreach ($patternChars as $char) {
if ($char == "(" || $char == "[")
$idle = true;
if (!$idle && in_array($char, $chars))
$char = "\\" . $char;
$escapedPattern .= $char;
if ($char == ")" || $char == "]")
$idle = false;
}
return $escapedPattern;
}
`
您可以在不同的部分建立正则表达式,以便只需要preg_quote
表达式的部分。
例如:
$pattern = preg_quote('\/login\/?next=').'(?P<next_url>.*)';
的问题是,该网址是用户定义的,所以我可以'没有这个方法 – renard 2012-04-24 18:52:27
我很困惑,你说的“网址”是用户定义的,但我认为'\/login \ /?next =(?P。*)'是一个模式不是网址?你是说整个事情都是由用户输入的吗? –
Robbie
2012-04-24 18:57:11
是的你说得对,'/ login /?next =(?P。*)'是用户定义的模式。我想要的是预先引用这个模式,并用这个模式和一个url执行preg_match。它更清楚吗? –
renard
2012-04-24 19:31:17