2014-09-05 3 views
0

La solution regex a suggéré sur PHP RegEx remove empty paragraph tags
#<p>(\s|&nbsp;|</?\s?br\s?/?>)*</?p>#preg_replace PHP Regex supprimer les balises vides paragraphe

échouer sur mon exemple-chaîne:
<p><br></p><div align="justify"><b>Some Text</b></div><p></p>

et je ne peux pas comprendre pourquoi.
Voir en direct Regex ici http://www.phpliveregex.com/p/6ID

+0

Fonctionne bien pour moi. 'preg_replace ($ re, '', $ str);' –

+0

moi aussi http://regex101.com/r/qW4dI6/3 –

+4

Utiliser regex pour manipuler les éléments DOM n'est pas vraiment une bonne idée, vous devriez utiliser un parseur DOM .http: //simplehtmldom.sourceforge.net/ –

Répondre

3

Vous ne devriez pas vraiment modifier un DOM en utilisant regex. Il y a des parseurs DOM pour faire ce genre de chose. Ce n'est même pas si difficile:

$html = '<p><br></p><div align="justify"><b>Some Text</b></div> 
<p>foobar</p> 
<p></p>';//empty 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
$pars = $dom->getElementsByTagName('p'); 
foreach ($pars as $tag) 
{ 
    if (!trim($tag->textContent)) 
    { 
     $tag->parentNode->removeChild($tag); 
    } 
} 

C'est tout. Vous sélectionnez simplement tous des p balises, puis vérifier si son contenu trim texte -ed est vide, si elle est: supprimer le nœud en sélectionnant son parent, et d'appeler la méthode DOMNode::removeChild ...
L'extrait ci-dessus 2 supprime des 3 nœuds de paragraphe, celui contenant foorbar est laissé tel quel. Je thinkg c'est ce que vous essayez de faire ...

Pour obtenir le fragment de dom réelle, après avoir enlevé les balises qui doivent être supprimés, vous pouvez simplement faire ceci:

echo trim(
    substr(
     $dom->saveHTML($dom->documentElement),//omit doctype 
     12, -14//12 => <html><body> and -14 for </body></html> 
    ) 
); 

proof of concept

+0

Merci pour cela - pense qu'il doit être légèrement modifié pour travailler avec plusieurs paragraphes vides cependant. par exemple. '

' – u01jmg3

+0

@ u01jmg3: L'avez-vous testé avec cette entrée? L'exemple que vous donnez (2 balises de paragraphe vides) devrait fonctionner correctement. Le code devrait ramasser sur les deux noeuds, et voir qu'il vide (et les enlever) –

+0

Nope; https://eval.in/601369 – u01jmg3

-1

Dans votre exemple en direct Regex vous utilisez des séparateurs doubles, voir http://www.phpliveregex.com/p/6II pour un exemple de travail. En outre, puisque le séparateur prédéfini est /, vous devez échapper les barres obliques dans le code (également dans l'exemple).

EDIT: En général, cependant, il est préférable de suivre la suggestion de Jay et de ne pas utiliser regex pour ce genre de tâches.

Questions connexes