RegEx剥离HTML注释

时间:2009-07-05 20:16:17

标签: php html regex

寻找匹配的正则表达式并替换(最好是PHP但无关紧要)来改变它(开头和结尾只是需要保留的随机文本)。

在:

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

到这个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

感谢。

13 个答案:

答案 0 :(得分:74)

您是否只想删除评论? <怎么样

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

或略好一点(提问者自己建议):

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

但是请记住,HTML 不是是常规的,所以使用正则表达式来解析它会导致你进入一个受到伤害的世界,当有人抛出奇怪的边缘情况时。

答案 1 :(得分:49)

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

此PHP代码将从$ html字符串中删除所有html注释标记。

答案 2 :(得分:20)

更好的版本是:

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

它符合以下html评论:

<!--
multi line html comment
-->

<!-- single line html comment -->

什么是最重要的它匹配这样的评论(其他人显示的其他正则表达不包括这种情况):

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

注意

虽然从语法上来说下面的一个是html注释,但是浏览器可能会以某种方式解析它,因此它可能具有特殊含义。剥离这些字符串可能会破坏您的代码。

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

答案 3 :(得分:16)

不要忘记考虑条件评论,如

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

将删除它们。试试这个:

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

这也将删除下层揭示的条件评论。

编辑:

这不会删除下层揭示或下层隐藏的评论。

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

答案 4 :(得分:8)

啊,我已经完成了,

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

答案 5 :(得分:2)

如果您的评论包含换行符,请尝试以下操作:

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

答案 6 :(得分:2)

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

在javascript和VBScript中也可用作“。”与所有语言的换行符不匹配

答案 7 :(得分:2)

接下来:

/( )*<!--((.*)|[^<]*|[^!]*|[^-]*|[^>]*)-->\n*/g

可以使用测试字符串删除多行注释:

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

<!-- --
> test
- -->

<!-- --
<- test <
>
- -->

<!--
test !<
- <!--
-->

<script type="text/javascript">//<![CDATA[
    var xxx = 'a';   
    //]]></script>

ok

答案 8 :(得分:1)

这些代码也删除了javascript代码。 那太糟糕了:|

这里的示例javascript代码将使用以下代码删除:

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

这是我的尝试:

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

这也会删除多行注释,并且不会删除下层显示或下层隐藏的注释。

答案 11 :(得分: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);

答案 12 :(得分:0)

如果您只希望文本或带有特定标签的文本,可以使用PHP strip_tags 进行处理,它还会删除HTML注释,并且您可以这样保存所需的HTML标签:

$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text, ['p', 'a']);

输出将是:

<p>Test paragraph.</p> <a href="#fragment">Other text</a>

我希望它能对某人有所帮助!