2010-10-21 146 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修饰符可以正常工作。