我有一串HTML,我需要检查任何锚点的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>
因此,相关网址采用以下格式
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');
理论上从这一点开始我会循环找到锚点并做一些东西,但是如果我var_dump $ anchors变量我得到:
object(DOMNodeList)#66 (0) { }
所以我甚至无法继续前进!
知道是什么导致DOM无法收集锚点吗?
之后有关如何最好地识别锚是否包含URL模式的任何建议,更改它并返回新修改的HTML?
事实证明,5.4.1之前存在一个PHP错误,它阻止了var_dump显示DOMNodeList的内容。我可以用
找到值foreach ($anchors as $anchors) {
echo $anchors->nodeValue, PHP_EOL;
}
但是我不知道$ anchors对象到底是什么样的,所以我是盲目的。如果有人有任何关于如何解析$ anchors和修改它们的建议,那将是非常感激的(当我尝试整理PHP5.4.1实例时)
答案 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);