PHP 使用 DOM 获取 anchor 并修改它们

标签 php dom anchor

我有一个 HTML 字符串,我需要检查任何 anchor 的 href 属性是否包含特定的链接模式。如果它们匹配某种模式,我需要修改它们。

这是一个示例 HTML 字符串:

<p>Disculpa, pero esta entrada está disponible sólo en <a href="http://www.example.com/static/?json=get_page&amp;post_type=page&amp;slug=sample-page&amp;lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&amp;post_type=page&amp;sample-page&amp;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&amp;post_type=page&amp;slug=sample-page&amp;lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&amp;post_type=page&amp;sample-page&amp;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/

相关文章:

c# - Windows 窗体 anchor ,以相同的比例保持面板内的控件?

javascript - 如何在URL中使用 anchor 标记?

PHP/Ajax/jQuery数据提交方式

php - 更改服务器时区后更新 MySQL 数据库中的时间戳

php - 没有给出 mime 类型

javascript - 输入焦点后触发主页按钮

php - 如何在呈现给可查看网页的 .php 文件中编写 php

jquery - 如何强制 DOM 在 ajax 查询之前和之后更新/刷新?

javascript - 为什么我刚创建 DOM 元素时并不存在?

javascript - 平滑滚动和锚定标签问题