webentwicklung-frage-antwort-db.com.de

RegEx zum Entfernen von HTML-Kommentaren

Wenn Sie nach einer Regex-Folge von Übereinstimmungen und Ersetzungen suchen (vorzugsweise PHP), können Sie dies ändern (Start und Ende sind nur zufälliger Text, der beibehalten werden muss).

IM:

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

zu diesem 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

Vielen Dank.

34
James Brooks

Versuchen Sie nur, die Kommentare zu entfernen? Wie wäre es mit

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

oder das etwas bessere (vom Fragesteller selbst vorgeschlagen):

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

Denken Sie jedoch daran, dass HTML nicht regelmäßig ist. Wenn Sie also reguläre Ausdrücke zum Analysieren verwenden, werden Sie in eine Welt voller Verletzungen geraten, wenn jemand bizarre Edge-Fälle darauf wirft.

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

Dieser PHP -Code entfernt alle HTML-Kommentar-Tags aus der $ html-Zeichenfolge. 

47

Eine bessere Version wäre:

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

Es passt zu folgenden HTML-Kommentaren:

<!--
multi line html comment
-->

oder

<!-- single line html comment -->

und was ist das Wichtigste es passt zu Kommentaren wie folgt (die anderen von anderen dargestellten Regex behandeln diese Situation nicht)

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

Hinweis

Obwohl der folgende Code syntaktisch ein HTML-Kommentar ist, wird er möglicherweise von Ihrem Browser auf andere Weise analysiert und hat daher eine besondere Bedeutung. Durch das Entfernen solcher Zeichenfolgen kann Ihr Code beschädigt werden.

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

Vergessen Sie nicht, bedingte Kommentare wie zu berücksichtigen 

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

wird sie entfernen. Versuchen Sie es stattdessen:

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

Dadurch werden jedoch auch die von Downlevel enthüllten bedingten Kommentare entfernt.

BEARBEITEN:

Kommentare, die auf der Ebene der Ebene angezeigt werden, werden nicht entfernt.

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

Ah ich habe es geschafft,

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

Versuchen Sie Folgendes, wenn Ihre Kommentare Zeilenumbrüche enthalten:

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

Funktioniert in Javascript und VBScript auch als "." stimmt nicht mit Zeilenumbrüchen in allen Sprachen überein

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

dieser Code entfernt auch Javascript-Code . das ist schade: |

hier wird der Beispiel-Javascript-Code mit diesem Code entfernt:

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

Hier ist mein Versuch:

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

Dadurch werden auch mehrzeilige Kommentare entfernt, und es werden keine nachgeschalteten oder nachgeschalteten Kommentare entfernt.

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