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

ale*_*ard 2 php anchor dom

我有一串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>
Run Code Online (Sandbox Code Playgroud)

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

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');
Run Code Online (Sandbox Code Playgroud)

理论上从这一点开始我会循环找到锚点并做一些东西,但如果我var_dump $ anchors变量我得到:

object(DOMNodeList)#66 (0) { }
Run Code Online (Sandbox Code Playgroud)

所以我甚至无法继续前进!

知道是什么导致DOM无法收集锚点吗?

之后有关如何最好地识别锚是否包含URL模式的任何建议,更改它并返回新修改的HTML?

更新1

事实证明,5.4.1之前存在一个PHP错误,它阻止了var_dump显示DOMNodeList的内容.我可以找到价值观

foreach ($anchors as $anchors) {
    echo $anchors->nodeValue, PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道$ anchors对象到底是什么样的,所以我是盲目的.如果有人有任何关于如何解析$ anchors和修改它们的建议,我们会非常感激(当我尝试整理PHP5.4.1实例时)

小智 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();
Run Code Online (Sandbox Code Playgroud)