【问题标题】:PHP: replace < between certain tags?PHP:替换某些标签之间的<?
【发布时间】:2012-10-14 02:42:11
【问题描述】:

在 PHP 中,我有一个包含 HTML 和 javascript 的模板:

<script>
  if (a < b) {
    alert(a);
  } 
</script>
<div>
  hello
</div>

这是通过 loadXML 方法输入到 DOMDocument 中的,但是由于脚本中的 &lt; 字符,这会产生错误。我知道我可以改用loadHTML 方法,但现在我只需要一个快速修复来替换script 标签内的< 替换它

所以问题是,替换&lt; 字符的最佳方法是什么,但只能在script 标签内?

【问题讨论】:

    标签: php preg-replace replace


    【解决方案1】:

    如果您可以修改 HTML,最好的解决方案是使用 &lt;![CDATA[]]&gt; 开始和结束标记用 CDATA 部分包装 JavaScript 代码。这将使文档成为有效的 XML,因此它可以被 XML 解析器解析。

    <script>
    // <![CDATA[
    
      if (a < b) {
        alert(a);
      } 
    
    // ]]>
    </script>
    

    【讨论】:

    • 是的,我发现自己已经……但不是很喜欢。模板应该可以为最终用户配置,他们可能不会理解这一点......所以我想通过自动添加这些标记或临时替换
    • 如果模板应该由最终用户配置,他们不应该摆弄 JavaScript 代码,或者应该提供这样的外部文件。除非您特别需要允许他们编写 JS,否则您应该必须将可编辑部分分开;一种仅用于 HTML,一种仅用于 JS
    【解决方案2】:

    如果您使用 XML 解析器,请为您的脚本使用 CDATA

    【讨论】:

      【解决方案3】:

      下面有一种方法可以在给定的 XHTML 代码中转义脚本。

      这段代码:

      <?php
      
      $code = <<<'CODE'
      <script>
        if (a < b) {
          alert(a);
        } 
      </script>
      <div>
        hello
      </div>
      CODE;
      
      echo preg_replace(
          '@(\<script(?:\s+[^>]*)?\>)([[:alnum:][:punct:][:space:]]+)(\</script\>)@',
          "\\1\n//<![CDATA[\n\\2\n//]]>\n\\3",
          $code);
      

      产生这个:

      <script>
      //<![CDATA[
      
        if (a < b) {
          alert(a);
        } 
      
      //]]>
      </script>
      <div>
        hello
      </div>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-22
        • 2019-06-21
        • 2014-08-15
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多