这有点难,我用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',
)
我的意思是我知道我的参数:[参数---获取此部分---]在'参数'之后所有文本都可以更改,它可以包含转义:括号 - 方括号 - 括号 - 符号。 谢谢!
答案 0 :(得分:0)
使用\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
)
)
答案 1 :(得分:0)
即使您提取了您感兴趣的子字符串,您也需要在第二次删除转义的方括号。让我们看看完整的解决方案:
$pattern = '~\[\w+\K[^]\\\]*(?:(?:\\\.)+[^]\\\]*)*+(?=])~s';
if (preg_match_all($pattern, $str, $m))
$result = array_map(function ($item) {
return strtr($item, array('\]' => ']', '\[' => '['));
}, $m[0]);