2010-10-21 136 views
0
if (preg_match_all ("/\[protected\]\s*(((?!\[protected\]|\[/protected\]).)+)\s*\[/protected\]/g", $text, $matches)) {             
     var_dump($matches); 
     var_dump($text); 
    } 

的文字是PHP preg_match_all正則表達式衝突

<p>SDGDSFGDFGdsgdfog<br> 
[protected]<br> STUFFFFFF<br> 
[/protected]<br> SDGDSFGDFGdsgdfog</p> 

但是$匹配時var_dump ED(if語句外),它給出了NULL

幫助的人!

回答

2
  1. 您使用/(斜槓)作爲正則表達式的分隔符,但你也必須在正則表達式轉義斜槓。要麼逃脫它們,要麼(最好)使用不同的分隔符。

  2. 在PHP正則表達式中沒有g修飾符。如果你想要一個全局匹配,你使用preg_match_all();否則您使用preg_match()

  3. ...但有s修飾符,你應該使用它。這就是.匹配換行符的原因。

改變你的正則表達式來之後:

'~\[protected\]\s*((?:(?!\[/?protected\]).)+?)\s*\[/protected\]~s' 

...我得到這樣的輸出:

array(2) { 
    [0]=> 
    array(1) { 
    [0]=> 
    string(42) "[protected]<br> STUFFFFFF<br> 
[/protected]" 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    string(18) "<br> STUFFFFFF<br>" 
    } 
} 
string(93) "<p>SDGDSFGDFGdsgdfog<br> 
[protected]<br> STUFFFFFF<br> 
[/protected]<br> SDGDSFGDFGdsgdfog</p>" 

其他變化:

  • 我切換到使用正則表達式附近的單引號;雙引號取決於$variable插值和{embedded code}評估。

  • 我通過使用可選斜槓(/?)縮短了查找表達式。

  • 我切換到使用不情願加(+?),所以結束標記之後的空白不包含在捕獲組中。

  • 我將最內層的組從捕獲改爲非捕獲;它只保存了匹配文本中的最後一個字符,這似乎毫無意義。

0
$text= '<p>SDGDSFGDFGdsgdfog<br> 
[protected]<br> STUFFFFFF<br> 
[/protected]<br> SDGDSFGDFGdsgdfog</p>'; 

if (preg_match_all ("/\[protected\]\s*(((?!\[protected\]|\[\/protected\]).)+)\s*\[\/protected\]/x", $text, $matches)) {             
     var_dump($matches); 
     var_dump($text); 
} 

有一個在preg_match沒有g修改 - 你可以在Pattern Modifiers閱讀更多。使用x修飾符可以正常工作。