所以我在这里有两个可能的字符串。
/user/name
和
/user/name?redirect=1
我正在试图找出正确的正则表达式以匹配结果:
Array ([0] => /user/name [1] => user [2] => name)
我认为我遇到问题的部分是问号和后面的GET查询是可选的,只会在某些时候出现。我尝试了很多不同的东西,似乎没有提出正则表达式来匹配字符串是否存在?**
答案 0 :(得分:4)
不要使用正则表达式,
$result = parse_url("/here/is/a/path?query=string");
$pieces = explode("/", $result['path']);
答案 1 :(得分:1)
?
是“零或一”量词。因此,您可以将(\?.*)?
附加到正则表达式,该正则表达式可选地匹配文字问号的零个或一个实例,后跟任意数量的字符。
答案 2 :(得分:0)
在正则表达式中,您可以使用?
参数指定某些内容为可选项。例如,正则表达式n?ever
匹配ever
和never
。
在您的情况下,您可能需要/([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。只需将具体问题的实际答案公布为完整性。