使用正则表达式在查询字符串中查找标记

时间:2010-03-24 11:10:39

标签: php regex uri

我必须在我的php应用程序中设置一些路由规则,它们应该在表单中 /%VAR /东西/ ELSE /%another_var

换句话说,我得到一个正则表达式,它返回每个由%字符标记的URI片段,标记为%的字符串表示var名称,因此它们几乎可以是每个字符串。

另一个例子: 来自/%lang / module / controller / action /%var_1 我希望正则表达式提取lang和var_1

我试过像

这样的东西
/.*%(.*)[\/$]/

但它不起作用.....

4 个答案:

答案 0 :(得分:1)

$str='/%var/something/else/%another_var';
$s = explode("/",$str);
$whatiwant = preg_grep("/^%/",$s);
print_r($whatiwant);

答案 1 :(得分:1)

看到它的路由规则,你可能需要在某些时候所有的部分,你也可以用经典的方式分割字符串:

$path_exploded = explode("/", $path);
foreach ($path_exploded as $fragment) if ($fragment[0] == "%") 
  echo "Found $fragment";

答案 2 :(得分:1)

我认为不需要使用正则表达式减慢脚本速度... trim()和explode()可以执行您需要的所有操作:

function extract_url_vars($url)
{
    if ( FALSE === strpos($url, '%') )
    {
        return $url;
    }

    $found = array();
    $parts = explode('/%', trim($url, '/') );

    foreach ( $parts as $part )
    {
        $tmp     = explode('/', $part);
        $found[] = ltrim( array_shift($tmp), '%');
    }

    return $found;
}

// Test
    print_r( extract_url_vars('/%lang/module/controller/action/%var_1') );

// Result:
Array
(
    [0] => lang
    [1] => var_1
)

答案 3 :(得分:0)

您可以使用:

$str = '/%lang/module/controller/action/%var_1';    
if(preg_match('@/%(.*?)/[^%]*%(.*?)$@',$str,$matches)) {
        echo "$matches[1] $matches[2]\n"; // prints lang var_1    
}