【发布时间】:2013-07-16 04:21:59
【问题描述】:
我有一个 HTML 字符串,我需要检查任何锚的 href 属性是否包含某种链接模式。如果它们匹配某种模式,我需要修改它们。
这是一个示例 HTML 字符串:
<p>Disculpa, pero esta entrada está disponible sólo en <a href="http://www.example.com/static/?json=get_page&post_type=page&slug=sample-page&lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&post_type=page&sample-page&lang=en">English</a>.</p>
因此,有问题的 URL 采用以下模式
http://www.example.com/static/?json=get_page&post_type=page&slug=sample-page&lang=ru
lang 查询属性的值是可变的。
如果找到与该模式匹配的 href,我需要将其更改为:
http://www.example.com/ru/sample-page
所以我需要删除'static'并将其替换为lang属性的值,并且我需要将'slug'属性的值附加到URL的末尾。
遗憾的是,我在第一步感到困惑,所以我什至无法测试解析 URL 并用新值替换它们的方法。
$html = '<p>Disculpa, pero esta entrada está disponible sólo en <a href="http://www.example.com/static/?json=get_page&post_type=page&slug=sample-page&lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&post_type=page&sample-page&lang=en">English</a>.</p>';
$dom = new DOMDocument;
// The UTF-8 encoding is necessary
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$anchors = $dom->getElementsByTagName('a');
理论上,从这一点开始,我会遍历找到的锚并做一些事情,但如果我 var_dump 变量 $anchors ,我只会得到:
object(DOMNodeList)#66 (0) { }
所以我什至无法继续前进!
知道是什么导致 DOM 无法收集锚点吗?
之后,关于如何最好地识别锚是否包含 URL 模式、更改它并返回新修改的 HTML 的任何建议?
更新 1
事实证明,5.4.1 之前的 PHP 错误会阻止 var_dump 显示 DOMNodeList 的内容。我可以用
找到值foreach ($anchors as $anchors) {
echo $anchors->nodeValue, PHP_EOL;
}
但是我不知道 $anchors 对象到底长什么样,所以我瞎了眼。如果有人对如何解析 $anchors 并按照最初提到的方式修改它们有任何建议,将不胜感激(同时我尝试整理 PHP5.4.1 实例)
【问题讨论】:
-
试试
count($anchors)看看你能得到多少 -
奇怪的是,count($anchors) 返回 1,但 var_dump 是:object(DOMNodeList)#66 (0) { }
-
我已更新问题以显示 $html 变量和 var_dump($anchors) 而不是 print_r
-
在我的最后工作正常,我得到
DOMNodeList Object ( [length] => 2 )。您是否在没有调用mb_convert_encoding的情况下检查了通过 html。我的猜测是文件编码或数据编码给你带来了一些问题。 -
这太奇怪了。我完全不知道为什么它不起作用。唔。我已经放弃了编码,仍然得到 var_dump($anchors) = object(DOMNodeList)#66 (0) { }