【问题标题】:Negative lookbehind on html comments with PHP for script extraction使用 PHP 对 html 注释进行负面回顾以提取脚本
【发布时间】:2014-10-27 23:55:46
【问题描述】:

我对 HTML 中的 IE cmets 有点问题。 我正在尝试从 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 的菜鸟。

谢谢!

【问题讨论】:

  • 不要使用正则表达式进行 html 解析。使用适当的 html 解析器,如 DomDocument。这将默认忽略条件 cmets
  • 是的,我知道,但我喜欢硬着头皮去做。 :)

标签: php html regex internet-explorer


【解决方案1】:
<!--.*?-->|<script(.*?)<\/script>

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

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

【讨论】:

  • 最后一期:它捕获了
【解决方案2】:

您在这里要求使用正则表达式,但它不是解析 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>

【讨论】:

  • 事实上,出于兼容性原因,我假设我不能使用 DOMDocument。是的,这很奇怪。但是你的解决方案没问题:)。
【解决方案3】:

检查你的正则表达式,见Here,我认为你可以将你的表达式修改为这样的:

      '/<script>(.*)<\/script>/U'   

你未经测试。但我认为这应该可以解决您的正则表达式。

【讨论】:

    【解决方案4】:

    这应该有效,因为它只捕获非 IE &lt;script&gt; 标记之间的内容。除非您想同时捕捉两个群体或做一些特别的事情,否则实际上并不需要向后看。

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

    示例:

    http://regex101.com/r/mL2gU0/3


    如果你想捕获你可以使用的 IE 标签:(&lt;!--\[.+IE.+[\n&lt;].+[^!][^&gt;&lt;\/].+)[example]

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 2013-08-03
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      相关资源
      最近更新 更多