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.

6voto

Personnellement, j'aimerais utiliser l'expression régulière ici. Le code ci-dessous a parfaitement fonctionné pour moi.

$baseUrl     = url('/'); // for my case https://www.xrepeater.com
$posted_url  = "home";
// Test with one by one
/*$posted_url  = "/home";
$posted_url  = "xrepeater.com";
$posted_url  = "www.xrepeater.com";
$posted_url  = "http://www.xrepeater.com";
$posted_url  = "https://www.xrepeater.com";
$posted_url  = "https://xrepeater.com/services";
$posted_url  = "xrepeater.dev/home/test";
$posted_url  = "home/test";*/

$regularExpression  = "((https?|ftp)\:\/\/)?"; // SCHEME Check
$regularExpression .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass Check
$regularExpression .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP Check
$regularExpression .= "(\:[0-9]{2,5})?"; // Port Check
$regularExpression .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path Check
$regularExpression .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query String Check
$regularExpression .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor Check

if(preg_match("/^$regularExpression$/i", $posted_url)) { 
    if(preg_match("@^http|https://@i",$posted_url)) {
        $final_url = preg_replace("@(http://)+@i",'http://',$posted_url);
        // return "*** - ***Match : ".$final_url;
    }
    else { 
          $final_url = 'http://'.$posted_url;
          // return "*** / ***Match : ".$final_url;
         }
    }
else {
     if (substr($posted_url, 0, 1) === '/') { 
         // return "*** / ***Not Match :".$final_url."<br>".$baseUrl.$posted_url;
         $final_url = $baseUrl.$posted_url;
     }
     else { 
         // return "*** - ***Not Match :".$posted_url."<br>".$baseUrl."/".$posted_url;
         $final_url = $baseUrl."/".$final_url; }
}

5voto

Jacob Relkin Points 90729

Vous pouvez utiliser preg_match .

$pattern = '/^(?:[;\/?:@&=+$,]|(?:[^\W_]|[-_.!~*\()\[\] ])|(?:%[\da-fA-F]{2}))*$/';
$string = 'some-url';
if( preg_match( $pattern, $string ) == 1 ) {
   // url is valid
}

4voto

Autumn Leonard Points 373

Étant donné les problèmes avec filter_var() qui nécessite http://, j'utilise :

$is_url = filter_var($filename, FILTER_VALIDATE_URL) || array_key_exists('scheme', parse_url($filename));

3voto

Vous pouvez utiliser cette fonction, mais elle retournera false si le site est hors ligne.

  function isValidUrl($url) {
    $url = parse_url($url);
    if (!isset($url["host"])) return false;
    return !(gethostbyname($url["host"]) == $url["host"]);
}

3voto

bodi0 Points 3900

Une autre façon de vérifier si une URL donnée est valide est d'essayer d'y accéder, la fonction ci-dessous récupère les en-têtes de l'URL donnée, ce qui permet de s'assurer que l'URL est valide. ET le serveur web est vivant :

function is_url($url){
        $response = array();
        //Check if URL is empty
        if(!empty($url)) {
            $response = get_headers($url);
        }
        return (bool)in_array("HTTP/1.1 200 OK", $response, true);
/*Array
(
    [0] => HTTP/1.1 200 OK 
    [Date] => Sat, 29 May 2004 12:28:14 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    [ETag] => "3f80f-1b6-3e1cb03b"
    [Accept-Ranges] => bytes
    [Content-Length] => 438
    [Connection] => close
    [Content-Type] => text/html
)*/ 
    }

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