web-dev-qa-db-fra.com

RegEx pour supprimer les commentaires HTML

Vous recherchez une séquence d'expressions rationnelles de correspondances et de substitutions (de préférence PHP mais cela n'a pas d'importance) pour changer cela (le début et la fin sont simplement du texte aléatoire à conserver).

DANS:

fkdshfks khh fdsfsk 
<!--g1-->
<div class='codetop'>CODE: AutoIt</div>
<div class='geshimain'>
    <!--eg1-->
    <div class="autoit" style="font-family:monospace;">
        <span class="kw3">msgbox</span>
    </div>
    <!--gc2-->
    <!--bXNnYm94-->
    <!--egc2-->
    <!--g2-->
</div>
<!--eg2-->
fdsfdskh

à cette OUT:

fkdshfks khh fdsfsk 
<div class='codetop'>CODE: AutoIt</div>
<div class='geshimain'>
    <div class="autoit" style="font-family:monospace;">
        <span class="kw3">msgbox</span>
    </div>
</div>
fdsfdskh

Merci.

34
James Brooks

Essayez-vous simplement de supprimer les commentaires? Que diriez-vous

s/<!--[^>]*-->//g

ou légèrement mieux (suggéré par le questionneur lui-même):

<!--(.*?)-->

Mais souvenez-vous que HTML est non regular, utiliser des expressions rationnelles pour l’analyser vous mènera à un monde de souffrances lorsque quelqu'un lui jette des cas étranges.

72
Paul Tomblin
preg_replace('/<!--(.*)-->/Uis', '', $html)

Ce code PHP supprimera toutes les balises de commentaire html de la chaîne $ html. 

47
Benoit Villière

Une meilleure version serait:

(?=<!--)([\s\S]*?)-->

Il correspond aux commentaires HTML comme ceux-ci:

<!--
multi line html comment
-->

ou

<!-- single line html comment -->

et le plus important cela correspond à des commentaires comme celui-ci (les autres expressions rationnelles montrées par d'autres ne couvrent pas cette situation):

<!-- this is my blog: <mynixworld.inf> -->

Remarque

Bien que syntaxiquement, le texte ci-dessous soit un commentaire html, votre navigateur peut l’analyser différemment, ce qui lui confère une signification particulière. Dénuder de telles chaînes pourrait casser votre code.

<!--[if !(IE 8) ]><!-->
17
Eugen Mihailescu

Ne pas oublier de considérer les commentaires conditionnels, comme 

<!--(.*?)-->

va les enlever. Essayez ceci à la place:

<!--[^\[](.*?)-->

Cela supprimera également les commentaires conditionnels révélés par le bas.

MODIFIER:

Cela ne supprimera pas les commentaires révélés ou cachés.

<!--(?!<!)[^\[>].*?-->
16
Pierre Wahlgren

Ah je l'ai fait,

<!--(.*?)-->
8
James Brooks

Essayez ce qui suit si vos commentaires contiennent des sauts de ligne:

/<!--(.|\n)*?-->/g
3
Hadrian
<!--([\s\S]*?)-->

Fonctionne en javascript et VBScript également en tant que "." ne correspond pas aux sauts de ligne dans toutes les langues

2
Toshinou Kyouko
function remove_html_comments($html) {
   $expr = '/<!--[\s\S]*?-->/';
   $func = 'rhc';
   $html = preg_replace_callback($expr, $func, $html);
   return $html;
}

function rhc($search) {
   list($l) = $search;
   if (mb_eregi("\[if",$l) || mb_eregi("\[endif",$l) )  {
      return $l;
   }
}
1
TurkiM

ces codes sont également supprimer le code javascript . c'est dommage: |

voici l'exemple de code javascript qui sera supprimé avec ce code:

<script type="text/javascript"><!--
    var xxx = 'a';
    //-->
    </script>
1
TomSawyer

Voici ma tentative:

<!--(?!<!)[^\[>][\s\S]*?-->

Cela supprimera également les commentaires multi-lignes et ne supprimera pas les commentaires révélés ou cachés au niveau inférieur.

1
// Remove multiline comment
    $mlcomment = '/\/\*(?!-)[\x00-\xff]*?\*\//';
    $code = preg_replace ($mlcomment, "", $code);
// Remove single line comment
    $slcomment = '/[^:]\/\/.*/';
    $code = preg_replace ($slcomment, "", $code);
// Remove extra spaces
    $extra_space = '/\s+/';
    $code = preg_replace ($extra_space, " ", $code);
// Remove spaces that can be removed
    $removable_space = '/\s?([\{\};\=\(\)\\\/\+\*-])\s?/';
    $code = preg_replace ('/\s?([\{\};\=\(\)\/\+\*-])\s?/', "\\1", $code);
0
Mister X