我有一个 HTML 字符串,我需要检查任何 anchor 的 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');
从理论上讲,从这一点开始,我会遍历找到的 anchor 并做一些事情,但如果我 var_dump $anchors 变量,我只会得到:
object(DOMNodeList)#66 (0) { }
所以我什至无法继续!
知道是什么导致 DOM 无法收集 anchor 吗?
关于如何最好地识别 anchor 是否包含 URL 模式、更改它并返回新修改的 HTML 有什么建议吗?
更新1
结果是 PHP 5.4.1 之前的错误阻止 var_dump 显示 DOMNodeList 的内容。我可以用
找到值foreach ($anchors as $anchors) {
echo $anchors->nodeValue, PHP_EOL;
}
但是我不知道 $anchors 对象到底是什么样子所以我瞎了。如果有人对如何解析 $anchors 并按照最初提到的那样修改它们有任何建议,我们将不胜感激(虽然我试图整理出一个 PHP5.4.1 实例)
最佳答案
不久前我也做过类似的事情。您可以遍历 DOMNodeList,然后获取 anchor 的 href 属性。
$dom = new DOMDocument;
$dom->loadHTML($content);
foreach ($dom->getElementsByTagName('a') as $node) {
$original_url = $node->getAttribute('href');
// Do something here
$node->setAttribute('href', $var);
}
$html = $dom->saveHtml();
关于PHP 使用 DOM 获取 anchor 并修改它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17667950/