2015-02-08 125 views
1

这有点难,我用srtpos解决了这个问题,但它很丑,我需要用preg_pos或preg_match来帮忙。我有一个字符串象下面这样:php正则表达式 - 用方括号内的方括号内容获得内容

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

我的意思是我知道我的参数:[参数---得到这个section-- - ]'参数'后所有文本都可以改变,并且可以包含转义:括号 - 方括号 - 括号 - 和符。 谢谢!

回答

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 
     ) 

) 
+0

哇,它太快了Avinash呢!谢谢我要测试它 – stackdave 2015-02-08 16:01:53

+0

对不起,我无法检查2回复,都是正确的! – stackdave 2015-02-08 16:22:19

+0

我和jhnyny的区别在于,我在正则表达式中加了'parameter',但是他使用了'\ w +',另一件事是,我逃过了字符类中所有的括号以避免混淆,但是他正确放置了括号逃跑。我为什么添加参数字符串的原因是因为'我的意思是我知道我的参数:'在你的问题中的字符串.. – 2015-02-08 16:28:13

0

即使你提取你有兴趣由子,你将需要删除的第二次逃脱方括号。让我们来看看完整的解决方案:

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

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

谢谢卡西米尔! – stackdave 2015-02-18 22:14:34

相关问题