2

我有一个 HTML 字符串,我需要检查任何锚的 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

所以我需要删除“静态”并将其替换为 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');

从理论上讲,从这一点开始,我会遍历找到的锚并做一些事情,但是如果我 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 实例)

4

5 回答 5

6

不久前我也做过类似的事情。您可以遍历 DOMNodeList,然后获取锚点的 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();
于 2013-07-16T05:27:45.147 回答
0
function getLinks($link)
{
$ret=array();

$dom=new DOMDocument;

@$dom->loadHTML(file_get_contents($link));

$dom->preserveWhiteSpace=false;

$links=$dom->getElementsByTagName('a');
 $html=$dom->saveHTML();
foreach($links as $tag)
{
    @$ret[$tag->getAttribute('href')]=$tag->childNodes->item(0)->nodeValue;
}

return $ret;
}
$link="http://php.net";

 $url=getLinks($link);
于 2013-12-11T07:26:51.933 回答
0

试试这个你会得到href价值

$anchors = $dom->getElementsByTagName('a');
echo $anchors->item(0)->attributes->getNamedItem('href');
于 2013-07-16T04:45:13.920 回答
0

也许先尝试回显html?也许你正在传递一个空的 html 或其他东西。

于 2013-07-16T04:40:13.077 回答
0

我同意海登的回答。但我想让解决方案更加独立。因为有时在我们操作 DOM 文档时,我们会遇到编码问题。这是下面给出的高级解决方案............

$dom = new DOMDocument;
$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
foreach ($dom->getElementsByTagName('a') as $node) {
    $original_url = $node->getAttribute('href');
    // Do something here
    $node->setAttribute('href', $var);
}
$html = $dom->saveHtml();
于 2017-11-27T08:08:54.420 回答