PHP使用DOM获取锚点并修改它们

时间:2013-07-16 04:21:59

标签: php dom anchor

我有一串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>

因此,相关网址采用以下格式

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实例时)

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试此操作即可获得href

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

答案 3 :(得分: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);