【发布时间】:2016-01-17 06:39:29
【问题描述】:
我已经搜索了几个小时(不应该有任何重复),并尝试了许多不同的方法,同时使用 regex(正则表达式)和 DOMdocument,但均未成功。
非标准 html 代码的样子:
<a class="SOMECLASS" href="javascript:__FUNCTION(SOME_HREF_INSIDE)" onclick="SOME_JS_FUNCTION();" id="SOME_ID" style="SOME_STYLE">
<a href="SOME_URL_3">SOME TEXT</a>
</a>
现在的问题是我正在尝试获取 url “SOME_URL_3”,并且在使用正则表达式或 DOMdocument 进行解析时,只要遇到第一个 href,就会停止粘贴。当然,由于第二个“a”标签是第一个标签的一部分,解析器只将其视为一个。
我观察到浏览器在解析时似乎会自动分隔标签,如下所示:
之前:
<a href="SOME_URL">
<a href="SOME_URL_2">
</a>
</a>
之后:
<a href="SOME_URL">
</a>
<a href="SOME_URL_2">
</a>
我无法使用 php 复制此浏览器的行为。
我尝试过的更接近工作的方法:
$dom = new DOMDocument();
@$dom->loadHTML($result);
foreach($dom->getElementsByTagName('a') as $link) {
$href_count = 0;
$attrs = array();
for ($i = 0; $i < $link->attributes->length; ++$i) {
$node = $link->attributes->item($i);
if ($node->nodeName == "href") {
$attrs[$node->nodeName][$href_count] = $node->nodeValue;
$href_count++;
if ($href_count >= 2) {
echo "A second href has been found";
}
}
}
echo "<pre>";
var_dump($attrs);
echo "</pre>";
}
如您所料,不幸的是它不起作用,在这种情况下,我不会在这里寻求帮助......
请不要犹豫,分享您的知识,任何帮助或建议将不胜感激!
更新
我忘记在我最初的问题中指定答案仍应允许捕获标准 href。我的目标是“扩展”或“改进”我的实际 html 解析器,以确保我也从任何 href 中检索 url。我的初始代码仅使用 RegEx,我无法从嵌套的“a”标签中捕获第二个 href。一个完美的答案将允许捕获嵌套和标准 href。 Brandon White 的解决方案仅适用于嵌套 href,但使用两个不同的 RegEx(嵌套/标准)两次解析整个 html 内容会耗费资源。如果可能的话,理想的解决方案是允许同时捕获两者的 RegEx。
【问题讨论】:
-
为什么要嵌套锚标签?
-
不幸的是,我完全无法控制我正在阅读的内容,我可以向您保证这不是我练习的一部分。谢谢你的提问。
-
从技术上讲,您能不能不使用 REGEX 环视来捕获两个锚标记?进一步提取这两者并删除除了最终的
href值之外的所有值? -
我实际上尝试了一些非常相似的方法,例如: if (substr_count($html, "href") > 1) { use a regex here to get the url } 但我使用这种方法的问题是我不确定如何从我的 foreach 循环中获取 $link 变量 raw html。 (请参阅我的问题中的代码)如果我能帮上忙,您的想法可能会奏效。
标签: php html regex href domdocument