0

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

参数在{},值在后面。

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

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

我想获得{}.

4

3 回答 3

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
*/

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

于 2013-07-23T07:11:27.523 回答
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);

如果我们忽略双重转义,它会执行以下操作;

  • 发现 {
  • 1 个或多个数字,直到 }
  • 1 个或多个数字,直到出现单词边界
于 2013-07-23T07:16:43.980 回答
0

试试这个。

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

获取所有奇数索引元素。

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

ETC...

于 2013-07-23T07:21:44.380 回答