用正则表达式拆分参数

时间:2012-01-19 17:33:35

标签: php regex url

我正在使用以下代码来分割传入的请求:

    /*
     *   Create global $GET from our cool URL's
     */
    preg_match_all('/[\/|\?|\&]([a-zA-Z\_0-9]+)([\/|=]([0-9]+)){0,1}/', $_SERVER['REQUEST_URI'], $parts, PREG_PATTERN_ORDER);
    if( count($parts[1]) >= 1 && count($parts[3]) >= 1)
        $GET = array_combine($parts[1], $parts[3]);

网址如“/ cat / 2 / post / 345 / answer / post”分为:

cat  => 2
post => 345
answer => 
post => 

是否可以更改此正则表达式以允许以下网址:/ post / 345-title-goes-here /并将其转换为:

post => 345-title-goes-here

因为现在它只有在参数严格为0-9且没有其他字符时才有效。甚至那对我来说也是一个真正的问题。有什么建议? :)

2 个答案:

答案 0 :(得分:1)

当然,而不是:

'/[\/|\?|\&]([a-zA-Z\_0-9]+)([\/|=]([0-9]+)){0,1}/'

尝试:

'/[\/|\?|\&]([a-zA-Z\_0-9]+)([\/|=]([0-9]+[a-zA-Z_-]*)){0,1}/'

我刚刚在0-9之后添加了一个可选(0或更多)设置中的额外字符。

答案 1 :(得分:1)

我会使用更简洁的一个:

#[/?&](\w+)([/=](\d[\w-]+))?#

所以preg_match_all变为:

preg_match_all('#[/?&](\w+)([/=](\d[\w-]+))?#', $_SERVER['REQUEST_URI'], $parts, PREG_PATTERN_ORDER);

根据评论更新:

#[/?&]([\w.()-]+)([/=](\d[\w.()-]+))?#

您可以在角色类中添加所需的每个角色。