PHP从一个字符串中提取值基于另一个字符串定义的模式

时间:2010-04-26 04:13:47

标签: php string

我有两个字符串:

$first = '/this/is/a/string';
$second = '/this/:param1/a/:param2';

我正试图解决这个问题:

$params = array('param1' => 'is', 'param2' => 'string');

但从a点到b点的证明比我疲惫的大脑现在可以处理的更多。

第二个字符串中以“:”开头的任何内容都定义了变量名称/位置。 $ second中可以有任意数量的变量需要从$ first中提取。细分由'/'分隔。

2 个答案:

答案 0 :(得分:2)

输入:

$first = '/this/is/a/string';
$second = '/this/:param1/a/:param2';
$src = explode('/', $first);
$req = explode('/', $second);
$params = array();
for ($i = 0; $i < count($req); $i++) {
  if (preg_match('!:(\w+)!', $req[$i], $matches)) {
    $params[$matches[1]] = $i < count($src) ? $src[$i] : null;
  }
}
print_r($params);

输出:

Array
(
    [param1] => is
    [param2] => string
)

答案 1 :(得分:2)

为了好玩,我会采用略有不同的方法。因为它使用较少的正则表达式和条件,所以它需要大约一半的时间,因为它使用较少的正则表达式和条件:

$first = '/this/is/a/string';
$second = '/this/:param1/a/:param2';

$firstParts = explode('/', $first);
$paramKeys = preg_grep('/^:.+/', explode('/', $second));

$params = array();
foreach ($paramKeys as $key => $val) {
    $params[substr($val, 1)] = $firstParts[$key]; 
}

/*
output:
Array
(
    [param1] => is
    [param2] => string
)
*/