【问题标题】:PHP using DOM to get anchors and modify themPHP 使用 DOM 获取锚点并修改它们
【发布时间】: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&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');

理论上,从这一点开始,我会遍历找到的锚并做一些事情,但如果我 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] =&gt; 2 )。您是否在没有调用 mb_convert_encoding 的情况下检查了通过 html。我的猜测是文件编码或数据编码给你带来了一些问题。
  • 这太奇怪了。我完全不知道为什么它不起作用。唔。我已经放弃了编码,仍然得到 var_dump($anchors) = object(DOMNodeList)#66 (0) { }

标签: php dom anchor


【解决方案1】:

不久前我也做过类似的事情。您可以遍历 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();

【讨论】:

  • 谢谢,午饭后我会调查的 :)
  • 嘿海登!你完全让我走上了正确的道路:) 我已经用对我有用的代码更新了你的答案(我希望没关系?)注意:http_build_url 需要 PECL。
【解决方案2】:

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

【讨论】:

  • 我刚刚更新了问题以显示我传递给它的 HTML 变量。
【解决方案3】:

试试这个你会得到href

$anchors = $dom->getElementsByTagName('a');
echo $anchors->item(0)->attributes->getNamedItem('href');

【讨论】:

  • empty $anchors 不会给任何东西!
【解决方案4】:
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);

【讨论】:

    【解决方案5】:

    我同意 Hyden 的回答。但我想让解决方案更加独立。因为有时在我们操作 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2012-06-13
      相关资源
      最近更新 更多