具有多个参数的URL的正则表达式

时间:2016-08-27 23:11:19

标签: php regex get

我正在尝试编译正则表达式以匹配以下格式的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; 
    }
}

2 个答案:

答案 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\/?(\?.*)?$/