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

Le texte estPHP preg_match_all RegEx conflit

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

Mais $ matches quand var_dump ed (en dehors de l'instruction if), il donne NULL

Aider les gens à!

Répondre

2
  1. Vous utilisez / (slash) comme séparateur regex, mais vous avez aussi des barres obliques dans le unescaped regex. Soit les échapper ou (de préférence) utiliser un délimiteur différent.

  2. Il n'y a pas de modificateur g dans les regex PHP. Si vous voulez une correspondance globale, vous utilisez preg_match_all(); sinon, vous utilisez preg_match().

  3. ... mais il est un modificateur s, et vous devriez être à l'utiliser. C'est ce qui permet à . de faire correspondre les nouvelles lignes.

Après avoir changé votre regex à ceci:

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

... Je reçois cette sortie:

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>" 

changements supplémentaires:

  • je suis passé à l'aide guillemets simples autour de l'expression rationnelle; les doubles quotes sont soumises à l'interpolation $variable et à l'évaluation {embedded code}.

  • J'ai raccourci l'expression lookahead en utilisant une barre oblique facultative (/?).

  • Je suis passé à l'utilisation d'un plus réticent (+?) afin que les espaces qui suivent la balise de fermeture ne soient pas inclus dans le groupe de capture.

  • J'ai changé le groupe le plus interne de la capture à la non-capture; c'était seulement sauver le dernier caractère dans le texte assorti, qui semble inutile.

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

Il n'y a pas de modification dans gpreg_match - vous pouvez en lire plus à Pattern Modifiers. En utilisant x modificateur fonctionne bien.