【问题标题】:DOMDocument stripping tags from inline scripts PHPDOMDocument 从内联脚本 PHP 中剥离标签
【发布时间】:2015-02-02 03:19:11
【问题描述】:

这很奇怪,但看起来 $dom->saveHTML() 正在从内联 javascript 中剥离标签

$domStr = '
<!DOCTYPE html>
   <html>
    <head>
        <meta charset="utf-8"/>
        <title>my page</title>
        <script>
            var elem = "<div>some content</div>";
        </script>
    </head>
    <body>
        <div>
            MY PAGE
        </div>
    </body>
</html>
';
    $doc = new DOMDocument();
    libxml_use_internal_errors(true);//prevents tags in js from throwing errors; see php.net manual
    $doc->formatOutput = true;
    $doc->strictErrorChecking = false;
    $doc->preserveWhiteSpace  = true;

    $doc->loadHTML($domStr);
    echo $doc->saveHTML();
exit;

http://sandbox.onlinephpfunctions.com/code/ad59a2a1016b2128e437ef61dbe00f1c511bff8d

如果你使用 libxml_use_internal_errors(true);你不会看到有什么问题,但如果删除你会得到 ​​p>

<b>Warning</b>:  DOMDocument::loadHTML(): Unexpected end tag : div

同样的事情发生在

$doc->formatOutput = false;

感谢任何帮助。

【问题讨论】:

    标签: javascript php domdocument


    【解决方案1】:

    您在 DOCTYPE 声明之后缺少开头的 &lt;html&gt; 标记。

    【讨论】:

    • &lt;script&gt; 标记在&lt;head&gt; 中的内容搞砸了。
    • 这就是使用的重点,我们需要在头部获取脚本
    • bud ,谢谢尝试,但这不是实际的脚本,我需要在页面上合并多个脚本并且不能破解它们才能这样做。我必须得到实际的脚本。关键是因为 libxml2 存在一个错误。 stackoverflow.com/questions/4029341/…
    • 那么就用&lt;script src="path_to_your_script"&gt;&lt;/script&gt; ?
    【解决方案2】:

    我已经通过 not 在我的内联 JavaScript 中包含任何 HTML 来避免这种情况。相反,我添加了 &lt;template&gt; 元素,其中包含我想在 JS 中操作的 HTML 字符串,然后我在运行时动态读取它。例如:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8"/>
            <title>my page</title>
        </head>
    
        <body>
            <div>
                MY PAGE
            </div>
    
            <template id="content-template">
                <div>some content</div>
            </template>
    
            <script>
                var elem = document.getElementById('content-template').innerHTML;
                ...
            </script>
        </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      这可能是 DomDocument 的一个错误。

      您必须在 JS 中转义 HTML 的结束标记,否则会被误解。

      这应该可以 var elem = "&lt;div&gt;some content&lt;\/div&gt;";

      或者,如果您将选项 1 传递给 loadHtml,解析器将忽略它。

      有点奇怪,1 可能意味着 LIBXML_SCHEMA_CREATE 和 LIBXML_ERR_WARNING,因为这两个预定义的常量具有相同的值。大概它是 LIBXML_SCHEMA_CREATE ,它执行以下“在 XSD 模式验证期间创建默认/固定值节点”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-11
        • 2019-09-04
        • 1970-01-01
        • 2013-04-03
        • 2019-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多