2011-01-18 4 views
0

J'aime supprimer toute balise html vide qui est vide ou contenant des espaces.Reg expression pour supprimer les balises vides (l'un d'entre eux)?

quelque chose comme obtenir:

$string = "<b>text</b><b><span> </span></b><p> <br/></p><b></b><font size='4'></font>"; 

à:

$string ="<b>text</b>=; 
+2

Qu'en est '' tags, ou d'autres balises significatives? Qu'en est-il de 'line1
line2'? Qu'en est-il des étiquettes vides «»? Pouvez-vous décrire votre objectif mieux - essayez d'expliquer ce que vous essayez de faire, pas comment vous pensez que cela devrait être fait. – Kobi

+0

En général, c'est une mauvaise idée d'analyser html avec des expressions régulières. Utiliser un analyseur xml à la place –

+0

En outre, je suppose qu'il devrait être '$ string =" texte ";', mais c'est probablement juste une faute de frappe. – Kobi

Répondre

0

Vous devez exécuter le code à plusieurs reprises afin de le faire uniquement avec des expressions régulières.

l'expression rationnelle qui fait cela est:

/<(?:(\w+)(?: [^>]*)?`> *<\/$1>)|(?:<\w+(?: [^>]*)?\/>)/g 

Mais par exemple sur votre chaîne que vous devez exécuter au moins deux fois. Une fois qu'il va supprimer le <br/> et la deuxième fois va supprimer les <p> </p> restants.

1
function stripEmptyTags ($result) 
{ 
    $regexps = array (
    '~<(\w+)\b[^\>]*>\s*</\\1>~', 
    '~<\w+\s*/>~' 
    ); 

    do 
    { 
     $string = $result; 
     $result = preg_replace ($regexps, '', $string); 
    } 
    while ($result != $string); 

    return $result; 
} 


$string = "<b>text</b><b><span> </span></b><p> <br/></p><b></b><font size='4'></font>"; 
echo stripEmptyTags ($string); 
+0

cela fait le travail. Juste 1 autres questions: 1) Comment puis-je dire à la fonction quelles étiquettes doivent être supprimées, disons que je dois juste supprimer: p, a et balises span. – walter

+0

Modifiez (\ w +) en (p | a | span). – akond

+2

Après une réflexion réfléchie, je pense vraiment que vous devriez utiliser l'approche DOM à la place plus fiable. – akond

3

Voici une approche avec DOM:

// init the document 
$dom = new DOMDocument; 
$dom->loadHTML($string); 

// fetch all the wanted nodes 
$xp = new DOMXPath($dom); 
foreach($xp->query('//*[not(node()) or normalize-space() = ""]') as $node) { 
    $node->parentNode->removeChild($node); 
} 

// output the cleaned markup 
echo $dom->saveXml(
    $dom->getElementsByTagName('body')->item(0) 
); 

Ce serait quelque chose de sortie comme

<body><b>text</b></body> 

documents XML nécessite un élément racine, donc il n'y a aucun moyen d'omettre cela. Vous pouvez le str_replace cependant. Ce qui précède peut gérer le HTML cassé.

Si vous souhaitez supprimer sélectivement des nœuds spécifiques, ajustez la requête XPath.

Voir aussi

Questions connexes