2010-07-04 5 views
3

Je traitais de refactoring de ma petite application web. toute la nuit. Aujourd'hui, quand j'ai commencé à tester, le premier bug que j'ai trouvé était un problème avec la fonction PHP système nl2br().comportement étrange PHP dans la fonction nl2br

Sur mon localhost J'ai la version PHP 5.2.9 et que je vois sur PHP site de la version 4.0.5 nl2br() est XHTML conforme.

Ensuite, je ne comprends absolument pas pourquoi mon nl2br() renvoie <br> sans second argument mis à false au lieu de <br />.

Voici ma méthode où j'ai trouvé ce bug:

public function eliminateTags($msg) { 
    $setBrakes = nl2br($msg); 
    $decodeHTML = htmlspecialchars_decode($setBrakes); 

    # Check PHP version 
    if((int)version_compare(PHP_VERSION, '4.0.5') == 1) { 
     $withoutTags = strip_tags($decodeHTML, '<br />'); 
    } else { 
     $withoutTags = strip_tags($decodeHTML, '<br>'); 
    } 

    return $withoutTags; 
} 
+2

Je ne peux pas dire que je peux reproduire cela avec le dernier PHP 5.2 Le changelog ne dit rien à ce sujet. Avez-vous un script qui reproduit ce problème? – Artefacto

+1

Comment vérifiez-vous les tags br? # Utilisez-vous Firebug (ou wathever outil similaire)? # cherchez-vous dans un fichier généré par votre script? # vérifiez-vous les chaînes générées par votre script? – Eineki

+0

Il utilise '
' par défaut pour moi, avec 5.3.2. –

Répondre

4

Je ne suis pas sûr que je comprends ce que vous essayez d'accomplir avec cette fonction. Tout d'abord, vous insérez des ruptures HTML dans chaque nouvelle ligne, puis vous supprimez toutes les balises sauf les ruptures.

Ne serait-il pas plus judicieux de supprimer les étiquettes en premier, puis d'insérer les sauts de ligne HTML?

public function eliminateTags($msg) { 
    $decodeHTML = htmlspecialchars_decode($msg); 
    $withoutTags = strip_tags($decodeHTML); 
    $setBreaks = nl2br($withoutTags); 

    return $setBreaks; 
} 

Edit:

Apparemment vous n'utilisez pas strip_tags() correctement. Vous devez demander à PHP quelle balise à exclure, qui est <br>, et non <br />. Demander PHP pour exclure <br />, c'est comme demander d'exclure, disons, <p></p> qui ne fonctionnera pas.

Qui à son tour signifie que vous ne devez pas vérifier une version de PHP - strip_tags() fonctionnera tel quel dans toutes les versions.

+0

+1 pour l'observation – Eineki

+1

pas vraiment une réponse, cependant. – Artefacto

+0

Okey, ça a marché. Mais était peut-être le problème quand j'ai essayé l'inverse? Je voulais faire une méthode pour éliminer les tags indésirables. Pour exmaple ce qui se passerait si j'ai écrit ' ', mais en utilisant cette méthode, il retournera' alret(); '. – Eugene

Questions connexes