我正在尝试编译正则表达式以匹配以下格式的URL:
http://www.example.com/param_1/param_2/.../param_n/?var_1=val_1&var2_=val_2&...val_n=var_n
换句话说,URL将有几个需要显式匹配的子目录(param_1 - param_n),以及需要随URL携带的未知数量的GET变量而不会使匹配失效。
(我已经看过其他主题,用于匹配一个,两个或三个GET变量,但没有一个匹配多个变量的一般正则表达式,这些变量的总数是未知的)
我有以下Regex用于以下网址:
URL: http://www.example.com/users/john/
REGEX: "users\/john\/([a-z|A-Z|0-9|-]+)([\/]{0,1})\/([a-z|A-Z|0-9|-]+)([\/]{0,1})$/"
RESULT: MATCH!! :)
但添加“GET”变量(http://www.example.com/users/john/?car=blue)并不会导致匹配(显然)。
我不是一个正则表达的大师,并且非常确定我的工作可能并不是非常优雅的开始,但是我没有运气,因为它使用其他变量。
我按以下方式匹配模式:
$routes = array(~~ REGEX => controller script ~~);
foreach($routes as $pattern=>$ctrl){
if(preg_match($pattern, URI)) {
echo 'MATCH!!';
break;
}
}
答案 0 :(得分:0)
首先分别提取所有参数和所有键值:
key-vals vvvv
^https?:\/\/[^\/]+((?:\/[^?]+)*)?(?:\?(.+))?$
^^^^^^^^^^^^^^^ params
对于示例网址,params = /param_1/param_2/.../param_n
和key-vals = var_1=val_1&var2_=val_2&...val_n=var_n
。
如果提取了参数,则获取每个单独的参数(使用全局来获取每个参数):
\/([^\/]+)
^^^^^^^^ individual param
如果提取了键值,则获取每个键和值(也使用全局):
vvvvvvv value
([^=]+)=([^&]+)
^^^^^^^ key
抱歉,我无法帮助PHP,但这应该指向正确的方向。
答案 1 :(得分:0)
感谢您的回复!以下正则表达式最终为我工作:
/^\/param_1\/param_2\/...\/param_n\/?(\?.*)?$/