Ich habe eine Klasse zusammengeschustert, die Links überprüft. Es funktioniert, aber es ist langsam:
Die Klasse analysiert einen HTML-String und gibt alle ungültigen Links für die Attribute href und src zurück. Hier ist, wie ich es verwende:
$class = new Validurl(array('html' => file_get_contents('http://google.com')));
$invalid_links = $class->check_links();
print_r($invalid_links);
Bei HTML mit vielen Links wird es wirklich langsam, und ich weiß, dass es jeden Link durchgehen und verfolgen muss, aber vielleicht kann mir jemand mit mehr Erfahrung ein paar Tipps geben, wie ich es beschleunigen kann.
Hier ist der Code:
class Validurl{
private $html = '';
public function __construct($params){
$this->html = $params['html'];
}
public function check_links(){
$invalid_links = array();
$all_links = $this->get_links();
foreach($all_links as $link){
if(!$this->is_valid_url($link['url'])){
array_push($invalid_links, $link);
}
}
return $invalid_links;
}
private function get_links() {
$xml = new DOMDocument();
@$xml->loadHTML($this->html);
$links = array();
foreach($xml->getElementsByTagName('a') as $link) {
$links[] = array('type' => 'url', 'url' => $link->getAttribute('href'), 'text' => $link->nodeValue);
}
foreach($xml->getElementsByTagName('img') as $link) {
$links[] = array('type' => 'img', 'url' => $link->getAttribute('src'));
}
return $links;
}
private function is_valid_url($url){
if ((strpos($url, "http")) === false) $url = "http://" . $url;
if (is_array(@get_headers($url))){
return true;
}else{
return false;
}
}
}