2010-06-17 8 views
0

Possible en double:
RegEx match open tags except XHTML self-contained tags/regexp/sur HTML, mais pas sous forme

je dois faire un certain remplacement regex sur l'entrée HTML, mais je dois exclure certaines parties du filtrage par d'autres regexp.

(par exemple supprimer toutes les balises <a> avec href="example.com… spécifiques, sauf ceux qui sont dans la balise <form>)

Y at-il technique regex intelligent pour cela? Ou dois-je trouver tous les formulaires en utilisant $regex1, puis diviser l'entrée en plus petits morceaux, à l'exclusion des blocs de texte correspondants, puis exécutez le $regex2 sur tous les morceaux?

+1

En avant lien vers la chose Zalgo. – MiffTheFox

+0

@Miff - bien fait! –

+0

@Miff Une des réponses célèbres que je n'ai pas encore vu;) – takeshin

Répondre

1

Pourquoi ne pouvez-vous jeter simplement la chaîne HTML dont vous avez besoin dans une aide DOM, puis utilisez getElementsByTagName('a') pour saisir toutes les ancres et utiliser getAttribute pour obtenir le href, removeChild pour l'enlever?

+0

L'OP a probablement un gros fichier HTML entrant et toute la question trouve à l'intérieur de

tags. –

0
  • Si des formulaires peuvent être imbriqués, cela est techniquement impossible.
  • Si les formes ne peuvent pas être imbriquées, c'est pratiquement impossible. Il n'y a pas de fonction où vous pouvez utiliser la même expression rationnelle
    1. définir une zone où la mise en correspondance doit être fait (c.-à-forme extérieure)
    2. définir les choses à apparier (c.-à-éléments)
2

La façon NON regexp:

<?php 
$html = '<html><body><a href="foo">a <b>bold</b> foz </a> b c <form><a href="foo">l</a></form> <a href="boz">a</a></body></html>'; 
$d = new DOMDocument(); 
$d->loadHTML($html); 
$x = new DOMXPath($d); 
$elements = $x->query('//a[not(ancestor::form) and @href="foo"]'); 
foreach($elements as $elm){ 
     //run if contents of <a> should be visible: 
     while($elm->firstChild){ 
       $elm->parentNode->insertBefore($elm->firstChild,$elm); 
     } 
     //remove a 
     $elm->parentNode->removeChild($elm); 
} 
var_dump($d->saveXML()); 
?> 
Questions connexes