2009-07-05 10 views
27

Vous cherchez une séquence d'expressions rationnelles et remplace (de préférence PHP, mais n'a pas d'importance) pour changer cela (le début et la fin est juste du texte aléatoire qui doit être conservé).RegExp pour supprimer les commentaires HTML

EN:

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 

à ceci:

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.

+0

D'après ce que je peux voir, vous essayez de supprimer les commentaires? –

+3

Vous l'avez posté d'une manière extrêmement illisible et incompréhensible. D'après ce que je peux comprendre en utilisant toutes les barres de défilement horizontales, vous voyez, vous essayez de supprimer les commentaires. Est-ce vrai? Si non, prenez soin de clarifier? – shylent

+2

S'il vous plaît modifier cela à quelque chose comme "RegExp pour dépouiller les commentaires HTML", puisque c'est en fait ce que votre réponse fait. – Novelocrat

Répondre

60

Etes-vous simplement en train d'essayer d'enlever les commentaires? Que diriez-vous

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

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

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

Mais rappelez-vous, HTML est pas régulière, donc en utilisant des expressions régulières pour analyser, il vous conduira dans un monde de blesser quand quelqu'un y jette des cas bizarres.

+0

Non, je veux que l'IN devienne la OUT, exactement comme elle est. –

+4

Je ne vois aucune différence autre que les commentaires. Vas-tu nous faire deviner? –

+0

@ James Brooks, la seule différence entre l'IN et l'OUT est que IN a des commentaires et OUT pas. Alors qu'est-ce que vous voulez mais dépouiller les commentaires? –

7

Ah je l'ai fait,

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

Oui, merci, tout est logique! – shylent

+0

Ce n'est pas aussi bon que le mien. –

+4

@Paul: C'est en fait mieux, parce que> pas précédé par - ne se termine pas un commentaire HTML. Le bit important qui a changé était l'utilisation d'une correspondance non gourmande ou plus courte. – Novelocrat

44
preg_replace('/<!--(.*)-->/Uis', '', $html) 

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

+3

Détails sur les modificateurs: U le rend Ungreedy et ainsi va seulement au premier commentaire proche. Je rends insensible à la casse (Je ne sais pas pourquoi cela est nécessaire ici) s signifie que les nouvelles lignes sont également autorisées dans les commentaires. –

+0

+1 pour Ungreedy spécifiquement appelé séparément de l'expression rationnelle, ce qui le rend plus facile à comprendre/lire. –

+1

Nous utilisons ce script depuis quelques années maintenant et cela a bien fonctionné. Mais s'il vous plaît considérez qu'il ignore le fait que la chaîne ' // ... ' – KTB

3

Effectuez les opérations suivantes si vos commentaires contiennent des sauts de ligne:

/<!--(.|\n)*?-->/g 
+5

Ce n'est pas une bonne façon de traiter le problème de nouvelle ligne. En PHP, vous pouvez utiliser le modificateur 's' pour permettre' .' de faire correspondre les nouvelles lignes. En JavaScript n'a pas un mode 's', mais la solution de contournement préférée est de remplacer le' .' avec '[\ S \ s]'. C'est beaucoup plus efficace que '(. | \ N)'. D'ailleurs, l'OP utilisait PHP, qui n'a pas de modificateur 'g'. –

+0

preg_match_all est le moyen d'indiquer global (modificateur g) – Snapey

+0

Ceci doit être supprimé car c'est un modèle dangereux et très consommateur de ressources. –

16

Ne pas oublier de tenir compte des commentaires conditionnels, comme

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

les enlèvera. Essayez ceci à la place:

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

Ceci supprimera également les commentaires conditionnels révélés par le niveau inférieur.

EDIT:

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

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

ce code est également supprimer le code javascript. c'est dommage: |

est ici l'exemple du code javascript sera supprimer avec ce code:

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

mais ... pourquoi encapsuler JS dans les tags de commentaire html? – jammypeach

+3

Les très, très, très, très vieux navigateurs n'exécutent pas javascript et l'impriment plutôt sur la page. Les balises de commentaire empêchent l'impression du script. – lededje

+0

vous pouvez l'utiliser '/ (?: [^>] \ S | ^) ] [\ s \ S] *? ->/g' https://jsfiddle.net/ 3vkrrt8e/ –

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

Works en javascript et VBScript aussi »."Ne correspond pas à des sauts de ligne dans toutes les langues

0
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; 
    } 
} 
12

Une meilleure version serait:

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

Il correspond à des commentaires HTML comme ceux-ci:

<!-- 
multi line html comment 
--> 

ou

<!-- single line html comment --> 

et wha t est le plus important il correspond à des commentaires comme celui-ci (l'autre regex montré par d'autres ne couvrent pas cette situation):

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

Remarque

Bien que syntaxiquement celui ci-dessous est un html commentaire Votre navigateur pourrait analyser d'une manière ou d'une autre différemment et ainsi il pourrait avoir une signification spéciale. Enlever de telles chaînes pourrait casser votre code.

<!--[if !(IE 8) ]><!--> 
+1

Une bonne regex ici, mais il pourrait être plus utile de changer ce qui suit afin que le commentaire puisse être complètement supprimé: '' '(? = ) '' ' – outboundexplorer

+0

c'est le meilleur – ismail

+0

Pourquoi ne pourrait-il pas être juste' () '? – Jarod

1

Voici ma tentative:

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

Cela permettra également supprimer des commentaires de plusieurs lignes et ne supprimera pas révélé downlevel ou downlevel caché commentaires.

0
// 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); 
Questions connexes