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