2012-04-24 78 views

回答

1

我已经实现我自己的功能做了一个解决办法:

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; 
} 

`

2

您可以在不同的部分建立正则表达式,以便只需要preg_quote表达式的部分。

例如:

$pattern = preg_quote('\/login\/?next=').'(?P<next_url>.*)'; 
+0

的问题是,该网址是用户定义的,所以我可以'没有这个方法 – renard 2012-04-24 18:52:27

+0

我很困惑,你说的“网址”是用户定义的,但我认为'\/login \ /?next =(?P 。*)'是一个模式不是网址?你是说整个事情都是由用户输入的吗? – Robbie 2012-04-24 18:57:11

+0

是的你说得对,'/ login /?next =(?P 。*)'是用户定义的模式。我想要的是预先引用这个模式,并用这个模式和一个url执行preg_match。它更清楚吗? – renard 2012-04-24 19:31:17