使用PHP进行脚本提取的html注释的负面观察

时间:2014-10-27 15:06:57

标签: php html regex internet-explorer

我在HTML中的IE注释有点问题。 我试图从html字符串解析脚本,这不是很难。 但是,在我的正则表达式中,我正在捕捉IE评论的脚本,而我并不是真的想要它。

目前我的脚本是:

function get_scripts($html){

   preg_match_all('#<script(.*?)</script>#is', $html, $matches);

   $scripts = "";

   if(isset($matches[0]) && is_array($matches[0])){   
      foreach ($matches[0] as $key => $value) {
          $scripts .= $value;
      } 
   }

    return $scripts;
   }


  $html = ' 
    <!--[if lt IE 9]>
      <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <script type="text/javascript">
        var domain_blog_json="";
    </script>
 ';

 echo get_scripts($html);

有谁知道如何实现这一目标? 我尝试过负面观察,但它不起作用,或者我(当然)是Reg Exp中的菜鸟。

谢谢!

4 个答案:

答案 0 :(得分:1)

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

试试这个。抓住捕获。它只会从非评论部分提供scripts。参见演示。

http://regex101.com/r/sU3fA2/20

答案 1 :(得分:1)

你在这里要求一个正则表达式,但它不是解析HTML的正确工具。您可以使用DOM执行此任务,而不是尝试使用正则表达式重新发明轮子。

$doc = DOMDocument::loadHTML('
<!--[if lt IE 9]>
  <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script type="text/javascript">
   var domain_blog_json="";
</script>
<!--[if lt IE 9]>
  <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
');

foreach($doc->getElementsByTagName('script') as $n) {
   echo $doc->saveHTML($n);
}

输出

<script type="text/javascript">
   var domain_blog_json="";
</script>

答案 2 :(得分:0)

检查您的正则表达式,请参阅Here,我认为您可以将表达式修改为以下内容:

      '/<script>(.*)<\/script>/U'   
你没有经过考验。但我认为这应该可以解决你的正则表达式。

答案 3 :(得分:0)

这应该有效,因为它只捕获非IE <script>标签之间的内容。除非您想要同时捕获这两个群体或特别做一些特别的事情,否则看起来并不是真的有必要。

(<script.+[\n<][^!][^><\/]+\n.+>)

示例:

<强> http://regex101.com/r/mL2gU0/3


如果您想捕获IE标记,可以使用:(<!--\[.+IE.+[\n<].+[^!][^><\/].+) [example]