【问题标题】:PHP DOMDocument - ignore unexpected closing tagsPHP DOMDocument - 忽略意外的结束标签
【发布时间】:2013-08-18 21:28:56
【问题描述】:

我正在破解我的 WordPress 主题页脚,但发现了一个小问题。

我正在做的是获取父主题的页脚,捕获输出,并使用 DOMDocument 修改元素。这是我的代码:

<?php
// I apologize in advance for my messy code....

/**
* JavaScript-like HTML DOM Element
*
* This class extends PHP's DOMElement to allow
* users to get and set the innerHTML property of lalalalala....
*
* @author Keyvan Minoukadeh - http://www.keyvan.net - keyvan@keyvan.net
* @see http://fivefilters.org (the project this was written for)
*/
// blahblahblah

ob_start();
require get_theme_root() . '/responsive/footer.php';
$output = ob_get_clean();

libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->registerNodeClass('DOMElement', 'JSLikeHTMLElement');
$dom->loadHTML($output);
$finder = new DomXPath($dom);
$classname="powered";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
$elem = $nodes->item(0);

$elem->innerHTML = "hahaha..gotcha!";

echo $dom->saveHTML();
?>

但是,页脚输出包含两个&lt;/div&gt;s(意外的结束标记),这让 DOMDocument 抱怨。事实上,它只是摆脱了那些&lt;/div&gt;s 并使页面看起来很奇怪。我不能只将&lt;/div&gt;&lt;/div&gt; 添加到输出的开头,因为&lt;/div&gt;s 周围有填充物。

有没有办法让 DOMDocument 忽略那些意外的标签并将它们留在那里,或者我应该使用不同的库?

【问题讨论】:

  • 没有 wordpress 专家,但这看起来像是修改主题的错误方法。
  • @Dagon 绝对是。见Child Themes
  • @Phil 这是一个儿童主题。我想将这些内容保留在页脚中,但不会在升级时引起问题。我不想要任何由 Wordpress 提供支持的页脚的痕迹,因为我的网站现在正受到暴力攻击。另外,我希望由 wordpress 提供支持的人说点别的,比如隐私政策的链接。
  • 作为参考,那些寻找攻击网站的人...通常不关心页脚中的一些文字。如果他们甚至在网络浏览器中访问您的网站,我会感到惊讶。它们通过某些 URL 可用的某些文件的存在来判断。
  • 只需将主题的页脚文件复制到子主题中并修改即可。这个 DOMDocument 废话不值得麻烦;事实上,它甚至更多可能在升级期间中断,因为您现在对文档结构的依赖程度甚至超过从修改后的页脚中吐出一些格式错误的 HTML。

标签: php html wordpress tags domdocument


【解决方案1】:

我找到了解决办法!

我没有使用 PHP 的 DOMDocument,而是使用了 Simple HTML DOM 库。这不会抱怨错误,甚至减少了代码量!

<?php
// Simple HTML DOM Parser
require (get_stylesheet_directory() . '/core/includes/simple_html_dom.php');

ob_start();
require (get_theme_root() . '/responsive/footer.php');
$outputhtml = str_get_html(ob_get_clean());

$outputhtml->find("div.powered", 0)->innertext = "<a href='/privacy-policy'>Privacy</a>";

echo $outputhtml;
?>

【讨论】:

  • 嗯。如果它对你有用,恭喜。我对 simple_html_dom 的个人经验是它是一堆热气腾腾的东西。我个人不得不将它从站点中删除并用 DOMDocument 替换它,因为它会导致大量内存泄漏。尝试下载最新版本进行测试,看看 bug 是否已修复,2/3 的测试脚本要么失败,要么彻底死机。
  • @cHao: simple_html_dom 没有自动托管内存。你需要自己管理它。
  • @SoroushFalahati:PHP 具有自动内存管理功能。 5.3 甚至包括一个适当的垃圾收集器。但是 simple_html_dom 不知何故设法把它全部扔掉了。
  • @cHao,除了 2.2 之外,我没有在任何其他版本的 PHP 中测试 simple_html_dom 并且不确定它是否有任何区别,但我认为 simple_html_dom 并没有很好地使用 PHP 内存管理系统。 AFAIK 与 DOMDocument 不同,它将大量数据保存在内存中,并且不会自动释放它们,因此您在使用它时需要处理好所有事情。
  • @SoroushFalahati:有点让这个名字成为谎言,不是吗。 :P
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多