php获取方括号内转义的方括号内容


php get content with square brackets escaped inside square brackets

这有点难,我有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',
)

我的意思是,我知道我的参数:[parameter---getthisesection---]在"parameter"之后,所有文本都可以更改,并且可以包含转义符:方括号-括号-符号。谢谢

使用'K丢弃以前匹配的字符。

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

演示

$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
        )
)

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

$pattern = '~'['w+'K[^]''']*(?:(?:'''.)+[^]''']*)*+(?=])~s';
if (preg_match_all($pattern, $str, $m))
    $result = array_map(function ($item) {
        return strtr($item, array('']' => ']', ''[' => '['));
    }, $m[0]);