【问题标题】:DOMDocument->saveHTML isn't working as expected with href attributesDOMDocument->saveHTML 无法使用 href 属性按预期工作
【发布时间】:2017-06-08 00:19:54
【问题描述】:

我正在尝试使用 PHP 解析一些 html 以添加一些节点,但 DOMDocument->saveHTML 的输出没有按预期工作,因为 href 属性已编码。

这是一个用于检查错误输出的简单代码:

$html = "<a href='javascript:console.log(\"klk\");'>click here</a>";
$doc = new DOMDocument();
$doc->loadHTML( $html );
echo $html . "\n";
echo "-----------------\n";
echo $doc->saveHTML( $doc->getElementsByTagName('a')[0] ) . "\n";

这是输出:

<a href='javascript:console.log("klk");'>click here</a>
-----------------
<a href="javascript:console.log(%22klk%22);">click here</a>

如您所见,href 属性出了点问题。

知道如何解决这个问题吗?

测试/播放网址:http://ideone.com/TsDhI3

【问题讨论】:

    标签: php escaping domdocument


    【解决方案1】:

    尝试以正确的格式编写 HTML,属性的值由双引号而不是单引号分隔,这样它们就不会被编码。 Javascript 识别由单引号分隔的字符串。

    这是一个例子:

     $html = '<a href="javascript:console.log(\'klk\');">click here</a>';
     $doc = new DOMDocument();
     $doc->loadHTML( $html );
     echo $html . "\n";
     echo "-----------------\n";
     echo $doc->saveHTML( $doc->getElementsByTagName('a')[0] ) . "\n";
    

    这是工作版本 - http://ideone.com/DjEyUX

    【讨论】:

    • 这只是一个例子,问题是html来自很多来源,我不能保证html是如何创建的......
    • DOMDocument() 功能是为正确的 HTML 构建的。如果您的应用从不受控制的来源获取输入,这些来源会给出乱码 HTML,您应该在输入之前使用实用程序对其进行清理。为此的库是 htmlpurifier.org/docsphp.net/manual/en/book.tidy.php
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2012-10-30
    • 2017-10-11
    • 2020-04-26
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多