我有字符串
$string = 'foo/{id}/bar/{name}';
我正在尝试进行正则表达式过滤
想要输出:
$matches = [
0 => 'foo/{id}/bar/{name}',
1 => 'id',
2 => 'name'
]
我到目前为止:(正则表达式是我的弱点)
preg_match('~^' . $magic . '$~', $string, $matches)
编辑:url中有* n个{variable}
答案 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