如何使用PHP阻止html实体DOMDocument :: saveHTML()?

时间:2015-04-04 15:25:02

标签: php domdocument

由于自定义存储需求(&#34;为什么&#34;在这里不重要,谢谢!)我必须以特定格式保存html <a>链接,例如:

myDOMNode->setAttribute("href", "{{{123456}}}");

一切正常,直到我在包含DOMDocument上调用saveHTML()。这会导致死亡,因为它会在{中对%7B进行编码。

这是一个遗留应用程序,其中href =&#34; {{{123456}}}&#34;作为占位符。命令行解析器完全(未编码)查找此模式,无法更改。

我别无选择,只能这样做。

我无法htmldecode()结果。

此HTML永远不会显示为此,只是存储需求。

感谢您的帮助!

注意:我已经环顾了2个小时,但建议的解决方案都没有为我工作。对于那些盲目地将问题标记为重复的人:请发表评论并告诉我。

1 个答案:

答案 0 :(得分:2)

由于旧版代码使用{{{...}}}作为占位符,因此使用preg_replace_callback的某种有点hackish方法可能是安全的。生成HTML后,以下内容将恢复URL编码的占位符:

$src = <<<EOS
<html>
    <body>
        <a href="foo">Bar</a>
   </body>
</html>
EOS;

// Create DOM document
$dom = new DOMDocument();
$dom->loadHTML($src);

// Alter `href` attribute of anchor
$a = $dom->getElementsByTagName('a')
    ->item(0)
    ->setAttribute('href', '{{{123456}}}');

// Callback function to URL decode match
$urldecode = function ($matches) {
    return urldecode($matches[0]);
};

// Turn DOMDocument into HTML string, then restore/urldecode placeholders 
$html = preg_replace_callback(
    '/' . urlencode('{{{') . '\d+' . urlEncode('}}}') . '/',
    $urldecode,
    $dom->saveHTML()
);

echo $html, PHP_EOL;

输出(为清晰起见缩进):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
    <body>
        <a href="{{{123456}}}">Bar</a>
    </body>
</html>