Websiten skriptgesteuert gegen den W3C-Validator testen

Der W3C Validator ist ja bereits bekannt im Internet und wird täglich viele tausendmal verwendet um Website auf ihre HTML Konformität zu überprüfen. Das Online Tool bietet hierbei verschiedene Optionen um die Prüfung durchzuführen, unteranderem eine API. Rund um diese API findet man auch schnell ein paar Wrapper Skripte die den Umgang damit erleichtern sollen. Ich habe mir einige angeschaut und ich konnte kein einfaches PHP-Skript finden, dass lediglich eine bestimmte URL zum W3C Validator hinschickt und das Ergebnis entgegenimmt. Etwa so wie man das vom Validator Plugin vom Firefox kennt. Einfach drauf klicken und ergebnis ablesen, nichts vorkonfigurieren oder initialisieren.

Da ich kein sinnvolles Skript für meine Bedürfnisse gefunden habe, schrieb ich kurzer Hand ein eigenes. Diese PHP-Skript nutze ich im Zusammenhang mit Jenkinis und validiere während des Deploy Prozesses die Websiten des jeweiligen Web Projektes. Somit ist sichergestellt, dass bei jedem Deploy valides HTML ausgeliefert wird.

Ganz einfach war die Sache leider nicht, da der Service des W3C Validator nicht unbedingt stabil zur Verfügung steht. Daher testet das Skript jede URL ein öfters, bis ein vernünftiger Rückgabe vom W3C Validator zurückkommt. Ich gehe aber davon aus, wenn der W3C Validator 3 mal hintereinander nichts vernüftiges zurückgibt, steht er einfach nicht zur Verfügung und der Test kann generell nicht durchgeführt werden.

/* setting infinite timelimit for the script, test can run a long time  */
set_time_limit(0);
 
/* define the url you like to check  */
$checkURL= array("http://mytesthost/index.php",
		"http://mytesthost/impressum.php/"
		);
 
foreach ($checkURL as $url){
 
	$http_status = "0";
	$i = 0;
 
	while($http_status!='200'){ 
 
		/* Fake the browser type */
		ini_set('user_agent','MSIE 4\.0b2;');
 
		/* read the respond into a result*/
		$result = file_get_contents($url);                                                                                                                          
 
		/* if there is no result of the testpage */
		if(empty($result)){
			echo "the check url can´t be open: ".$checkURL ;
			clean_up();
			exit(1);
		}else{
			file_put_contents('tmp.html',$result);
		}
 
		/* take a break, so the wc3 validator can recover */
		sleep(20);
 
		/* setting the vars for the w3c validator*/
		$target_url = 'http://validator.w3.org/check?output=soap12&outline&uploaded_file';
		$file_name_with_full_path = realpath('tmp.html');
		$post = array('extra_info' => '123456','uploaded_file'=>'@'.$file_name_with_full_path.";type=text/html");
 
		/* all the curl operation */
		$ch = curl_init();
		curl_setopt($ch,CURLOPT_USERAGENT,'MSIE 4\.0b2;');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_VERBOSE, 1);
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_URL,$target_url);
		curl_setopt($ch, CURLOPT_POST,1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
		$result=curl_exec ($ch);
		$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close ($ch);
 
		/* 	checking the respond of the w3c validator 
			it turns our very often a 500, so we try again 
		*/
		if($http_status!='200'){
			/* counting the error tries */
			$i++;
		}else{
			/* resetting the error counting */
			$i = 0;
 
			/* pealing the https headers from the validator*/
			/* status VALID or INVALID */
			$pos = strrpos($result, "X-W3C-Validator-Status:");
			if ($pos != 0) {
				$status = substr($result, $pos + 23, 8);
				$status = trim($status," ");
			}
			/* Number of Errors */
			$pos = strrpos($result, "X-W3C-Validator-Errors:");
			if ($pos != 0) { 
				$errors = substr($result, $pos + 23, 4);
			}
			/* Number of Warnings */
			$pos = strrpos($result, "X-W3C-Validator-Warnings:");
			if ($pos != 0) { 
				$warnings = substr($result, $pos + 25, 4);
			}	
 
			/* checking the result and setting exitcode */
			if(strtoupper($status)=="INVALID"){
				echo "SITE: ".$url." ";
				echo "NUMBER OF HTML WARNINGS:".$warnings." ";
				echo "NUMBER OF HTML ERRORS:".$errors." ";
				clean_up();
				exit(1);
			}			
		}
 
		/* if we tried it three times in a row and always error then exit */
		if($i == 3){
			echo 'the w3c validator is not there!';
			clean_up();
			exit(1);
		}
	}
}
/* cleaning up tmp file */
clean_up();
/* if there is no error exit fine */
exit(0);
/*
##########################################################################
 
	functions 
 
##########################################################################
*/
function clean_up(){
	/* clean up tmp files */
	!unlink('tmp.html');
}
?>
http://www.agile-coding.net/websiten-skriptgesteuert-gegen-den-w3c-validator-testen/