196 votes

Meilleur moyen de vérifier si une URL est valide

Je veux utiliser PHP pour vérifier si la chaîne de caractères stockée dans le fichier $myoutput contient une syntaxe de lien valide ou c'est juste un texte normal. La fonction ou la solution que je recherche devrait reconnaître tous les formats de liens, y compris ceux avec des paramètres GET.

Une solution, suggérée sur de nombreux sites, consiste en fait à interroger la chaîne de caractères (en utilisant CURL ou file_get_contents() ) n'est pas possible dans mon cas et je voudrais l'éviter.

J'ai pensé aux expressions régulières ou à une autre solution.

0 votes

L'utilisation de CURL ou la récupération de son contenu HTTP peut être lente, si vous voulez quelque chose de plus rapide et de presque aussi fiable, envisagez d'utiliser gethostbyaddr() sur le nom d'hôte. S'il se résout à une IP, alors il a probablement un site web. Bien sûr, cela dépend de vos besoins.

1 votes

Je serais intéressé par le cas d'utilisation de ce système.

409voto

Gordon Points 156415

Vous pouvez utiliser une Valideur de filtre

filter_var($url, FILTER_VALIDATE_URL);

Valide la valeur comme URL (selon " http://www.faqs.org/rfcs/rfc2396 ), avec éventuellement les composants requis. Attention, une URL valide peut ne pas spécifier le protocole HTTP http://. Une validation supplémentaire peut donc être nécessaire pour déterminer que l'URL utilise un protocole attendu, par exemple ssh:// ou mailto :. Notez que la fonction ne considère que les URL ASCII comme valides ; les noms de domaine internationalisés (contenant des caractères non ASCII) échoueront.

Ejemplo:

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
    die('Not a valid URL');
}

9 votes

@Raveren comportement attendu puisque ce sont des URLs valides.

20 votes

Sachez que FILTER_VALIDATE_URL ne validera pas le protocole d'une url. Donc ssh:// , ftp:// etc. passeront.

6 votes

@SephVelut comportement attendu puisque ce sont des URLs valides.

38voto

Erich García Points 497

Voici le meilleur tutoriel que j'ai trouvé là-bas :

http://www.w3schools.com/php/filter_validate_url.asp

<?php
$url = "http://www.qbaki.com";

// Remove all illegal characters from a url
$url = filter_var($url, FILTER_SANITIZE_URL);

// Validate url
if (filter_var($url, FILTER_VALIDATE_URL) !== false) {
echo("$url is a valid URL");
} else {
echo("$url is not a valid URL");
}
?>

Drapeaux possibles :

FILTER_FLAG_SCHEME_REQUIRED - URL must be RFC compliant (like http://example)
FILTER_FLAG_HOST_REQUIRED - URL must include host name (like http://www.example.com)
FILTER_FLAG_PATH_REQUIRED - URL must have a path after the domain name (like www.example.com/example1/)
FILTER_FLAG_QUERY_REQUIRED - URL must have a query string (like "example.php?name=Peter&age=37")

25voto

Huey Ly Points 384

L'utilisation de filter_var() échouera pour les urls avec des caractères non ascii, par exemple ( http://pt.wikipedia.org/wiki/Guimarães ). La fonction suivante permet d'encoder tous les caractères non ascii (par ex. http://pt.wikipedia.org/wiki/Guimar%C3%A3es ) avant d'appeler filter_var().

J'espère que cela aidera quelqu'un.

<?php

function validate_url($url) {
    $path = parse_url($url, PHP_URL_PATH);
    $encoded_path = array_map('urlencode', explode('/', $path));
    $url = str_replace($path, implode('/', $encoded_path), $url);

    return filter_var($url, FILTER_VALIDATE_URL) ? true : false;
}

// example
if(!validate_url("http://somedomain.com/some/path/file1.jpg")) {
    echo "NOT A URL";
}
else {
    echo "IS A URL";
}

11voto

mghhgm Points 189
function is_url($uri){
    if(preg_match( '/^(http|https):\\/\\/[a-z0-9_]+([\\-\\.]{1}[a-z_0-9]+)*\\.[_a-z]{2,5}'.'((:[0-9]{1,5})?\\/.*)?$/i' ,$uri)){
      return $uri;
    }
    else{
        return false;
    }
}

7voto

En fait... filter_var($url, FILTER_VALIDATE_URL) ; ne fonctionne pas très bien. Lorsque vous tapez une vraie url, cela fonctionne mais, il ne vérifie que http://. donc si vous tapez quelque chose comme " http://weirtgcyaurbatc ", il dira quand même que c'est réel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X