PHP正则表达式preg_match在url

时间:2017-07-14 14:14:28

标签: php regex preg-match

我有字符串

$string = 'foo/{id}/bar/{name}';

我正在尝试进行正则表达式过滤

想要输出:

$matches = [
  0 => 'foo/{id}/bar/{name}',
  1 => 'id',
  2 => 'name'
]

我到目前为止:(正则表达式是我的弱点)

preg_match('~^' . $magic . '$~', $string, $matches)
  

编辑:url中有* n个{variable}

3 个答案:

答案 0 :(得分:0)

使用以下preg_match_all方法:

$str = 'foo/{id}/bar/{name}/many/{number}/of/{variables}';
preg_match_all('/\{([^{}]+)\}/', $str, $m);

print_r($m[1]);

输出:

Array
(
    [0] => id
    [1] => name
    [2] => number
    [3] => variables
)

答案 1 :(得分:0)

可以使用regex完成,但也可以使用简单的字符串和数组处理来完成:

$string = 'foo/{id}/bar/{name}';

// Collect the values here, indexed by parameter names
$params = array();
// Remove any trailing and ending separator then split to pieces
$pieces = explode('/', trim($string, '/'));
// Every two pieces, the first one is the key, the other is the value
foreach (array_chunk($pieces, 2) as list($key, $value)) {
    // Put the values in $params, index by keys
    $params[$key] = $value;
}

print_r($params);

输出:

Array
(
    [foo] => {id}
    [bar] => {name}
)

自PHP 5.5起,list($key, $value)构造工作正常。如果您遇到旧版本,可以使用旧的,更详细的方式:

foreach (array_chunk($pieces, 2) as $pair) {
    list($key, $value) = $pair;
    $params[$key] = $value;
}

答案 2 :(得分:0)

我在评论中看到罗马人回答说这不仅仅是他需要的两个变量。通过滚动搜索更多变量更新了我的回复

这也可以用strpos和strrpos来完成。

$string = "foo/{id}/bar/{name}/many/{number}/of/{variables}";
$pos = strpos($string, "{"); // find the first variable 
$matches = array();
while($pos!=0){ // while there are more variables keep going
    $matches[] = substr($string, $pos+1, strpos($string, "}", $pos)-$pos-1); //substring the variable from $pos -> ending }
    $pos = strpos($string, "{", $pos+1); // find the next variable
}
var_dump($matches);

strpos找到“/”的位置并添加一个(因此它在子字符串中不包含“/”)。
http://php.net/manual/en/function.strpos.php

https://3v4l.org/pWXTh