PHP匹配字符串模式并获取变量

3
我会尽力为您翻译中文,以下是需要翻译的内容:

我查阅了一些参考资料,例如这个问题这个问题,但是我仍然不知道我应该怎么做。

我想要做的是:

假设我有两个字符串:

$str1 = "link/usa";
$str2 = "link/{country}";

现在我想要检查这个模式是否符合。如果匹配,我希望将国家的值设置为usa。
$country = "usa";

我希望它也能在以下情况下正常工作:

...

$str1 = "link/usa/texas";
$str2 = "link/{country}/{place}";

也许还有整数。像匹配每个花括号并为变量提供值一样。(如果可能的话,性能更好)。
由于我对正则表达式非常陌生,所以无法找到解决方法。先谢谢您了。
2个回答

6

它会按预期给出结果

$str1 = "link/usa";
$str2 = "link/{country}";

if(preg_match('~link/([a-z]+)~i', $str1, $matches1) && preg_match('~link/{([a-z]+)}~i', $str2, $matches2)){
    $$matches2[1] = $matches1[1];
    echo $country;
}

注意:上面的代码只解析字母,您可以根据需要扩展范围内的字符。
更新:
您也可以使用explode来完成,如下例所示:
$val1 = explode('/', $str1);
$val2 = explode('/', $str2);
${rtrim(ltrim($val2[1],'{'), '}')} = $val1[1];
echo $country;

更新 2

$str1 = "link/usa/texas/2/";
$str2 = "/link/{country}/{city}/{page}";

if(preg_match_all('~/([a-z0-9]+)~i', $str1, $matches1) && preg_match_all('~{([a-z]+)}~i', $str2, $matches2)){

    foreach($matches2[1] as $key => $matches){
        $$matches = $matches1[1][$key];
    }
    echo $country; 
    echo '<br>';
    echo $city;
    echo '<br>';
    echo $page;
}

性能如何?我可以依赖这个循环运行一百次吗? - tika
1
@tika,如果你想避免使用正则表达式,也可以使用explode来完成,详见我的更新答案。 - kamal pal
${rtrim(ltrim($val2[1],'{'), '}')} => ${trim($val2, '{}')} 更简单。 - Casimir et Hippolyte
@CasimiretHippolyte $val2是一个数组,它也不包含所需的要赋值的值。感谢你的建议。 - kamal pal
抱歉,我忘记了 [1] - Casimir et Hippolyte
显示剩余2条评论

2

如果你可以构建一个关联数组,并且这个数组在后面可能更方便使用,那么我就看不出使用键作为变量名的意义了。这样做还可以避免编写丑陋的动态变量名 ${the_name_of_the_var_${of_my_var_${of_your_var}}}

$str1 = "link/usa/texas";
$str2 = "link/{country}/{place}";

function combine($pattern, $values) {
    $keys = array_map(function ($i) { return trim($i, '{}'); },
                      explode('/', $pattern));
    $values = explode('/', $values);

    if (array_shift($keys) == array_shift($values) && count($keys) &&
        count($keys) == count($values))
        return array_combine($keys, $values);
    else throw new Exception ("invalid format");
}

print_r(combine($str2, $str1));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接