【问题标题】:How can I prevent html entities with PHP a DOMDocument::saveHTML()?如何使用 PHP a DOMDocument::saveHTML() 防止 html 实体?
【发布时间】:2015-04-04 15:25:02
【问题描述】:

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

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

一切正常,直到我在包含的 DOMDocument 上调用 saveHTML()。这会杀死它,因为它会将{ 编码为%7B

这是一个旧版应用程序,其中 href="{{{123456}}}" 用作占位符。命令行解析器会准确查找此模式(未编码)并且无法更改。

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

我无法对结果进行 htmldecode()。

这个 HTML 永远不会这样显示,它只是一个存储需求。

感谢您的帮助!

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

【问题讨论】:

  • 确实对它进行了编码。但这并不能解释您所说的“这会杀死它”是什么意思。这是一个 URL,它们可以被编码,没问题。让大家看看我不是在开玩笑,我做了一个例子:ergobase.nl/test25.html 看源代码,它是编码的,点击链接,它可以工作!哇。那么请告诉我你所说的“这会杀死它”是什么意思?
  • 你是对的,链接可以工作,但这是一个遗留应用程序,其中 href="{{{123456}}}" 用作占位符。命令行解析器会准确查找此模式(未编码)并且无法更改。
  • 如果在saveHTML() 之后和将其发送到命令行解析器之前使用html_entity_decode() 会发生什么?
  • 正如我所说不能那样做(页面有其他编码实体必须保持不变)
  • 你说它是一个遗留应用程序;你用的是什么 PHP 版本?

标签: php domdocument


【解决方案1】:

由于旧代码使用{{{...}}} 作为占位符,因此可以安全地使用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>

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2011-11-12
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多