如何使用 PHP a DOMDocument::saveHTML() 阻止 html 实体?
How can I prevent html entities with PHP a DOMDocument::saveHTML()?
由于自定义存储需要("why" 在这里不重要,谢谢!)我必须以特定格式保存 html <a>
链接,例如:
myDOMNode->setAttribute("href", "{{{123456}}}");
一切正常,直到我对包含的 DOMDocument 调用 saveHTML()
。这会杀死它,因为它在 %7B
.
中编码 {
这是一个遗留应用程序,其中 href="{{{123456}}}" 用作占位符。命令行解析器会准确地(未编码)查找此模式且无法更改。
只好这样了
我无法 htmldecode() 结果。
这个HTML永远不会显示成这个样子,它只是一个存储需要。
感谢您的帮助!
注意:我环顾四周 2 小时,但 none 提议的解决方案对我有用。对于那些盲目地将问题标记为重复的人:请评论并告诉我。
由于遗留代码使用 {{{...}}}
作为占位符,因此对 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>
由于自定义存储需要("why" 在这里不重要,谢谢!)我必须以特定格式保存 html <a>
链接,例如:
myDOMNode->setAttribute("href", "{{{123456}}}");
一切正常,直到我对包含的 DOMDocument 调用 saveHTML()
。这会杀死它,因为它在 %7B
.
{
这是一个遗留应用程序,其中 href="{{{123456}}}" 用作占位符。命令行解析器会准确地(未编码)查找此模式且无法更改。
只好这样了
我无法 htmldecode() 结果。
这个HTML永远不会显示成这个样子,它只是一个存储需要。
感谢您的帮助!
注意:我环顾四周 2 小时,但 none 提议的解决方案对我有用。对于那些盲目地将问题标记为重复的人:请评论并告诉我。
由于遗留代码使用 {{{...}}}
作为占位符,因此对 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>