我有一串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>
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&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');
Run Code Online (Sandbox Code Playgroud)
理论上从这一点开始我会循环找到锚点并做一些东西,但如果我var_dump $ anchors变量我得到:
object(DOMNodeList)#66 (0) { }
Run Code Online (Sandbox Code Playgroud)
所以我甚至无法继续前进!
知道是什么导致DOM无法收集锚点吗?
之后有关如何最好地识别锚是否包含URL模式的任何建议,更改它并返回新修改的HTML?
事实证明,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)