正则表达式匹配可选部分

时间:2010-11-03 23:13:50

标签: php regex escaping

所以我在这里有两个可能的字符串。

/user/name

/user/name?redirect=1

我正在试图找出正确的正则表达式以匹配结果:

Array ([0] => /user/name [1] => user [2] => name)

我认为我遇到问题的部分是问号和后面的GET查询是可选的,只会在某些时候出现。我尝试了很多不同的东西,似乎没有提出正则表达式来匹配字符串是否存在?**

4 个答案:

答案 0 :(得分:4)

不要使用正则表达式,

使用parse_url()explode()

$result = parse_url("/here/is/a/path?query=string");
$pieces  = explode("/", $result['path']);

答案 1 :(得分:1)

?是“零或一”量词。因此,您可以将(\?.*)?附加到正则表达式,该正则表达式可选地匹配文字问号的零个或一个实例,后跟任意数量的字符。

答案 2 :(得分:0)

在正则表达式中,您可以使用?参数指定某些内容为可选项。例如,正则表达式n?ever匹配evernever

在您的情况下,您可能需要/([A-Za-z0-9]+)/([A-Za-z0-9]+)(\?redirect=1)?

之类的内容

这将匹配/.../...(假设“......”由字母和数字组成)或/.../...?redirect=1

如果问号后面有更多可能的标记,而不仅仅是redirect=1,请尝试更通用的标记:

/([A-Za-z0-9]+)/([A-Za-z0-9]+)(\?[A-Za-z0-9]+=[A-Za-z0-9]+)?(&[A-Za-z0-9]+=[A-Za-z0-9]+)*

答案 3 :(得分:0)

preg_match('{^/(user)/(name)(?=\?redirect=1)?$}', $subject, $matches);

这是look ahead assertion。它不会包含在比赛中。

但与其他答案一样,建议您不要使用正则表达式来解析URL。只需将具体问题的实际答案公布为完整性。