检查URL是否有效的最佳方法

Rya*_*yan 136 php

我想使用PHP来检查,如果存储在$myoutput变量中的字符串包含有效的链接语法,或者它只是一个普通的文本.我正在寻找的功能或解决方案应该识别所有链接格式,包括具有GET参数的格式.

在许多网站上建议的实际查询字符串(使用CURL或file_get_contents()函数)的解决方案在我的情况下是不可能的,我想避免它.

我考虑过正则表达式或其他解决方案.

Gor*_*don 280

您可以使用本机Filter Validator

filter_var($url, FILTER_VALIDATE_URL);
Run Code Online (Sandbox Code Playgroud)

将值验证为URL(根据» http://www.faqs.org/rfcs/rfc2396),可选地使用必需的组件.请注意,有效的URL可能未指定HTTP协议http://因此可能需要进一步验证以确定URL使用预期的协议,例如ssh://或mailto:.请注意,该函数只能找到有效的ASCII URL; 国际化域名(包含非ASCII字符)将失败.

例:

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
    die('Not a valid URL');
}
Run Code Online (Sandbox Code Playgroud)

  • @Raveren预期行为,因为这些是有效的URL. (9认同)
  • 它还允许像`http:// example`这样的网址(thik`localhost`是一个网址) (8认同)
  • 请注意,`FILTER_VALIDATE_URL`不会验证网址的协议.所以`ssh://`,`ftp://`等会通过. (7认同)
  • @SephVelut的预期行为,因为它们是有效的URL。 (3认同)
  • @JoshHabdas,我想您错过了重点。PHP代码完全按照其声明的方式工作。但这看不懂你的想法。无效和不需要之间有巨大的区别。不需要是非常主观的,这就是为什么它留给程序员来解决这个细节的原因。您可能还会注意到该代码验证了URL,但没有证明它存在。用户输入可以验证的“ amazon”,“ amozon”并不是错误的PHP,但这仍然是不需要的。 (3认同)
  • @Jeffz ttps://www.youtube.com *是*语法上有效的 URL。请注意答案中的引用。 (2认同)

Eri*_*cía 14

这是我在那里找到的最好的教程:

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");
}
?>
Run Code Online (Sandbox Code Playgroud)

可能的标志:

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")
Run Code Online (Sandbox Code Playgroud)

  • 只是一个 nit: `!filter_var(...) === false` ==&gt; `filter_var(...) === true` 或者只是 `filter_var(...)`。:) (3认同)

Hue*_* Ly 10

对于具有非ascii字符的网址,使用filter_var()将失败,例如(http://pt.wikipedia.org/wiki/Guimarães).以下函数在调用filter_var()之前编码所有非ascii字符(例如http://pt.wikipedia.org/wiki/Guimar%C3%A3es).

希望这有助于某人.

<?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";
}
Run Code Online (Sandbox Code Playgroud)


mgh*_*hgm 6

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我个人想在这里使用正则表达式。波纹管代码非常适合我。

$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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是验证网站 URL 的最佳答案。只需要很少的改变就可以完美地工作。谢谢 (3认同)

小智 5

其实... filter_var($url, FILTER_VALIDATE_URL); 效果不佳。当您输入真实的 url 时,它可以工作,但是,它只检查 http://,因此如果您输入类似“ http://weirtgcyaurbatc ”的内容,它仍然会说它是真实的。