php regex - 获取带方括号的内容在方括号内转义

时间:2015-02-08 15:44:25

标签: php regex

这有点难,我用srtpos解决了这个问题,但是它很难看,我需要帮助才能用preg_pos或preg_match来做。我有一个如下字符串:

$text="Some 
[parameter=value\[anoter value|subparam=20] with  or 
[parameter|value\]anoter value|subparam=21|nothing] or 
[parameter=value\[anoter value\]|subparam=22] ";

...我想得到以下结果:

array (
  0 => '=value[anoter value|subparam=20',
  1 => '|value[anoter value|subparam=21|nothing',
  2 => '=value[anoter value]|subparam=22',
)

我的意思是我知道我的参数:[参数---获取此部分---]在'参数'之后所有文本都可以更改,它可以包含转义:括号 - 方括号 - 括号 - 符号。 谢谢!

2 个答案:

答案 0 :(得分:0)

使用\K丢弃之前匹配的字符。

\[parameter\K(?:\\[\]\[]|[^\[\]])*

DEMO

$re = "~\\[parameter\\K(?:\\\\[\\]\\[]|[^\\[\\]])*~m";
$str = "Some \n[parameter=value\[anoter value|subparam=20] with or \n[parameter|value\]anoter value|subparam=21|nothing] or \n[parameter=value\[anoter value\]|subparam=22] \";\nfoo bar";
preg_match_all($re, $str, $matches);
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => =value\[anoter value|subparam=20
            [1] => |value\]anoter value|subparam=21|nothing
            [2] => =value\[anoter value\]|subparam=22
        )

)

答案 1 :(得分:0)

即使您提取了您感兴趣的子字符串,您也需要在第二次删除转义的方括号。让我们看看完整的解决方案:

$pattern = '~\[\w+\K[^]\\\]*(?:(?:\\\.)+[^]\\\]*)*+(?=])~s';

if (preg_match_all($pattern, $str, $m))
    $result = array_map(function ($item) {
        return strtr($item, array('\]' => ']', '\[' => '['));
    }, $m[0]);