从花括号中获取url param

时间:2013-07-23 07:07:29

标签: php string url strpos

我有这个网址:../foo::bar{2}233{13}171{1}1{20}0.html

参数位于{},后面是值。

有了这个,我可以得到一个参数 - 尽管有花括号:

if (false !== strpos($url,'{2}')) {
        echo 'success';
    } else {
        echo 'error';
}

我想让每个值都落后于{}

3 个答案:

答案 0 :(得分:1)

尝试使用preg_match_all()

$str = '../foo::bar{2}233{13}171{1}1{20}0.html';

$pattern = "/\{\d+\}/";

preg_match_all($pattern, $str, $matches);

$prevStart = 0;
foreach($matches[0] as $match)
{
    $matchLen = strlen($match);
    $matchPos = strpos($str, $match, $prevStart);

    // Try to find the position of the next open curly brace
    $openCurlyPos = strpos($str, '{', $matchPos + $matchLen);

    // In case there is none found (.html comes up next), search for the . instead
    if($openCurlyPos === false)
        $openCurlyPos = strpos($str, '.', $matchPos + $matchLen);

    $length = $openCurlyPos - ($matchPos + $matchLen);

    $prevStart = $openCurlyPos;
    echo $match.': '.substr($str, $matchPos + $matchLen, $length).'<br />';
}

/*
Result:

{2}: 233
{13}: 171
{1}: 1
{20}: 0
*/

我知道这种方式可能非常多余,但我不知道如何使用正则表达式来做到这一点。这对于人们来说也似乎更容易理解。

答案 1 :(得分:0)

使用preg_match_all您可以提取键和值,这是一个样本模式;

$matches = null;
$returnValue = preg_match_all('/\\{(\\d+)\\}(\\d+)\\b/', '../foo::bar{2}233{13}171{1}1{20}0.html', $matches, PREG_SET_ORDER);

如果我们忽略双重转义,它的确如下;

  • 找一个{
  • 一个或多个数字,直到a}
  • 一个或多个数字,直到出现单词边界

答案 2 :(得分:0)

试试这个。

$pieces = explode("}", $str);

获取所有奇数索引元素。

$pieces[1],$pieces[3],$pieces[5]

等...