好的,所以我正在用PHP编写应用程序以检查我的网站是否所有链接都有效,所以如果必须的话我可以更新它们。
我遇到了一个问题。我尝试使用SimpleXml和DOMDocument对象来提取标签但是当我使用示例站点运行应用程序时,如果我使用SimpleXml对象类型,我通常会遇到大量错误。
那么有没有办法扫描html文档中的href属性,这与使用SimpleXml一样简单?
<?php
// what I want to do is get a similar effect to the code described below:
foreach($html->html->body->a as $link)
{
// store the $link into a file
foreach($link->attributes() as $attribute=>$value);
{
//procedure to place the href value into a file
}
}
?>
所以基本上我正在寻找一种方法来执行上述操作。问题是我现在对如何使用html代码处理字符串感到困惑......
为了清楚起见,我使用以下原始方式获取html文件:
<?php
$target = "http://www.targeturl.com";
$file_handle = fopen($target, "r");
$a = "";
while (!feof($file_handle)) $a .= fgets($file_handle, 4096);
fclose($file_handle);
?>
任何信息都会有用,以及任何其他语言替代方案,其中上述问题更加优雅地修复(python,c或c ++)
答案 0 :(得分:1)
这是我们用于编写的HTML解析工具的一堆代码。
$target = "http://www.targeturl.com";
$result = file_get_contents($target);
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
@$dom->loadHTML($result);
$links = extractLink(getTags( $dom, 'a', ));
function extractLink( $html, $argument = 1 ) {
$href_regex_pattern = '/<a[^>]*?href=[\'"](.*?)[\'"][^>]*?>(.*?)<\/a>/si';
preg_match_all($href_regex_pattern,$html,$matches);
if (count($matches)) {
if (is_array($matches[$argument]) && count($matches[$argument])) {
return $matches[$argument][0];
}
return $matches[1];
} else
function getTags( $dom, $tagName, $element = false, $children = false ) {
$html = '';
$domxpath = new DOMXPath($dom);
$children = ($children) ? "/".$children : '';
$filtered = $domxpath->query("//$tagName" . $children);
$i = 0;
while( $myItem = $filtered->item($i++) ){
$newDom = new DOMDocument;
$newDom->formatOutput = true;
$node = $newDom->importNode( $myItem, true );
$newDom->appendChild($node);
$html[] = $newDom->saveHTML();
}
if ($element !== false && isset($html[$element])) {
return $html[$element];
} else
return $html;
}
答案 1 :(得分:0)
您可以使用strpos($html, 'href=')
然后解析网址。您还可以搜索<a
或.php