8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai la fonction suivante qui me permet de tester les adresses url (récupérer sur php.net et améliorer).

function url_exists($url){
	$a_url = parse_url($url);
	if (!isset($a_url['port'])) $a_url['port'] = 80;
	$errno = 0;
	$errstr = '';
	$timeout = 30;
	if(isset($a_url['host']) && $a_url['host']!=gethostbyname($a_url['host'])){
		$fid = fsockopen($a_url['host'], $a_url['port'], $errno, $errstr, $timeout);
		if (empty($fid)) return false;
		$page = isset($a_url['path'])?str_replace("__","",$a_url['path']):'';
		$page .= isset($a_url['query'])?'?'.$a_url['query']:'';
		fputs($fid, 'HEAD '.$page.' HTTP/1.0'."\r\n".'Host: '.$a_url['host']."\r\n\r\n");
		$head = fread($fid, 4096);
		fclose($fid);
		return preg_match('#^HTTP/.*\s+[200|301|302]+\s#i', $head);
	}else{
		return false;
	}
}


J'ai un fichier texte qui contient une liste de toutes les adresses url que je veux tester.

Le problème est que certaines de ces adresses contiennent des $FILE comme par exemple:
http://www.monsite.com/help/$FILE/test.doc?open

Ma fonction de test me retourne donc false pour une adresse de ce type alors que c'est une adresse valide.

En revanche si je fais un $url = 'http://www.monsite.com/help/$FILE/test.doc?open' et que je lance ma fonction, cela me retourne true.

Pour résumé:


//Premiere version, Lecture du fichier
$url = fgets($fp); //$fp correspond a la ligne.
$ret = url_exists($url);
//ici $ret est égal a false.

//Deuxieme version, test en sauvegardant directement dans une variable une adresse test.
$url = 'http://www.monsite.com/help/$FILE/test.doc?open';
$ret = url_exists($url);
//ici $ret est égal a true.


Voila je sais c'est tordu. Merci a tout ceux et celles qui prendront le temps de m'aider.

PS: ce test est pour un programme dans le cadre d'un stage et je dois tester des adresses url de mon entreprise. (je sais y'a des boulets qui code leurs adresses url avec des $ mais je n'y suis pour rien).
Modifié par ashesheart (05 Jul 2007 - 11:37)
Je viens de trouver la solution:
Lors de la lecture d'un fichier le fgets doit mal convertir en chaine de caracteres.
J'ai donc fait un

$url = strval($url).