web-dev-qa-db-fra.com

Supprimer les commentaires HTML avec Regex, en Javascript

J'ai un mauvais HTML généré à partir de Word, à partir duquel je veux enlever tous les commentaires HTML.

Le HTML ressemble à ceci:

<!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML/> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:HyphenationZone>21</w:HyphenationZone> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>NO-BOK</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]-->

..et le regex que j'utilise est celui-ci

html = html.replace(/<!--(.*?)-->/gm, "")

Mais il semble n'y avoir aucune correspondance, la chaîne est inchangée.

Qu'est-ce qui me manque?

38
rodbv

Le regex /<!--[\s\S]*?-->/g devrait fonctionner.

Vous allez tuer des séquences de texte d'échappement dans des blocs CDATA.

Par exemple.

<script><!-- notACommentHere() --></script>

et du texte littéral dans des blocs de code formatés

<xmp>I'm demoing HTML <!-- comments --></xmp>

<textarea><!-- Not a comment either --></textarea>

MODIFIER:

Cela n'empêchera pas non plus l'introduction de nouveaux commentaires comme dans

<!-<!-- A comment -->- not comment text -->

qui après un tour de cette expression rationnelle deviendrait

<!-- not comment text -->

Si cela pose un problème, vous pouvez échapper le < qui ne fait pas partie d'un commentaire ou d'une balise (compliqué pour obtenir un résultat correct) ou vous pouvez effectuer une boucle et le remplacer comme ci-dessus jusqu'à ce que la chaîne se calme.


Voici une expression rationnelle qui correspondra aux commentaires, y compris psuedo-comments et aux commentaires non fermés, conformément à la spécification HTML-5. Les sections CDATA ne sont strictement autorisées qu'en XML étranger. Cela souffre des mêmes mises en garde que ci-dessus.

var COMMENT_PSEUDO_COMMENT_OR_LT_BANG = new RegExp(
    '<!--[\\s\\S]*?(?:-->)?'
    + '<!---+>?'  // A comment with no body
    + '|<!(?![dD][oO][cC][tT][yY][pP][eE]|\\[CDATA\\[)[^>]*>?'
    + '|<[?][^>]*>?',  // A pseudo-comment
    'g');
68
Mike Samuel

Vous devriez utiliser le modificateur /s

html = html.replace (/<!--.*?-->/sg, "")

Testé en Perl:

use strict;
use warnings;

my $str = 'hello <!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML/> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:HyphenationZone>21</w:HyphenationZone> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>NO-BOK</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]-->world!';

$str =~ s/<!--.*?-->//sg;
print $str;

Sortie:
hello world!

2
sln

cela fonctionne aussi pour multiline - (<!--.*?-->)|(<!--[\w\W\n\s]+?-->)

 enter image description here

1
Aurielle Perlmann
html = html.replace("(?s)<!--\\[if(.*?)\\[endif\\] *-->", "")
0
Dmitry Negoda