2010-10-21 2 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 RegEx конфликт

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

Но $ матчи, когда var_dump издание (вне если заявление), он выдает NULL

помочь людям!

ответ

2
  1. Вы используете / (слэш) в качестве регулярного выражения разделителя, но вы также имеете неэкранированный слэш в регулярном выражении. Либо избегайте их, либо (предпочтительно) используйте другой разделитель.

  2. Модификатор g в PHP регулярных выражениях. Если вы хотите глобальное совпадение, вы используете preg_match_all(); в противном случае вы используете preg_match().

  3. ... но там is a 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}.

  • Я сократил выражение lookahead, используя дополнительную косую черту (/?).

  • Я переключился на использование неохотного плюс (+?), поэтому пробелы, следующие за закрывающим тегом, не включаются в группу захвата.

  • Я изменил самую внутреннюю группу от захвата до не захвата; он сохранял только последний символ в совпадающем тексте, что кажется бессмысленным.

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); 
} 

Там нет g модификатора в preg_match - вы можете прочитать на Pattern Modifiers. Использование модификатора x отлично работает.

Смежные вопросы