2015-02-08 124 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

相關問題