我怎样才能防止PHP一个DOMDocument :: saveHTML()方法HTML实体?(How

2019-10-22 12:46发布

由于定制的存储需求(“为什么”在这里并不重要,谢谢!)我有保存HTML <a>特定格式的链接,如这样的:

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

直到我打电话,一切工作正常saveHTML()对含DOM文档。 这杀死它,因为它编码{%7B

这是一个遗留应用程序,其中HREF =“{{{123456}}}”作品的占位符。 命令行解析器外表此图案恰好(未编码),并且不能被改变。

我没有选择,只能做这种方式。

我不能htmldecode()的结果。

此HTML将永远不会被显示这一点,它只是一个存储需求。

谢谢你的帮助!

注:我看了看周围2小时,但没有提出解决方案为我工作。 对于那些谁就会盲目地标记问题的重复:请评论,让我知道。

Answer 1:

由于遗留代码是使用{{{...}}}作为一个占位符,它可以安全使用带有几分hackish的方法preg_replace_callback 。 一旦生成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>


文章来源: How can I prevent html entities with PHP a DOMDocument::saveHTML()?