【问题标题】:URL Validation in PHPPHP 中的 URL 验证
【发布时间】:2015-10-03 06:11:57
【问题描述】:

在 StackOverflow 上已经对这个主题进行了很多讨论,但我设法探索的所有答案都未能产生我需要的结果。我想在将 URL 插入数据库之前检查该值实际上是一个 URL。 PHP FILTER_VALIDATE_URL 的默认函数返回 true,即使我们只提供 httpp://exampl

但只有当它是一个真正的域(如 example.net、example.com 等)时,我才需要验证该值。让我们尝试一个示例:

案例一:

$url = "http://example";
if(!filter_var($url, FILTER_VALIDATE_URL) === false) {
                return true;
            }

以上返回 true,但域无效。

案例 2:

$url = "http://google.com";
if(!filter_var($url, FILTER_VALIDATE_URL) === false) {
                return true;
            }

返回真,没关系。

但案例 1 的任何可能解决方案?请帮忙。

P.S.:我使用了 CURL,它可以工作,但是响应太慢(超过 5 秒)。任何固体溶液将不胜感激。

【问题讨论】:

  • 什么是真正的域?我不确定你认为什么是有效的
  • get_headers 会帮忙吗?
  • 感谢@Dagon,您的回复。对不起我在问题中的错别字。我已经编辑过了。我的意思是example 不能是有效域,因为它缺少 TLD(.com、.net 等),但该函数将其视为有效域。我希望我让你清楚我的问题。
  • 您的意思是像http://www.still-might-not-exist.com 这样的“结构良好”还是真的像http://example 中的智能生命一样正确(是的...您可以在局域网中拥有一台服务器来回答这个问题?如果你想检查服务器是否存在,你别无选择,只能探测它们......那么回答速度不在你手中
  • 你不能为此准备正则表达式吗?

标签: php validation url


【解决方案1】:

我编写了一个快速脚本,可以帮助您实现所需:

<?php
//error_reporting(E_ALL);
//ini_set('display_errors', 1);
$url = "http://www.google.com";


if(validateUrl($url)){
    echo "VALID";
}else{
    echo "INVALID";
}

function validateUrl($url){

//first we validate the url using a regex

if (!preg_match('%^(?:(?:https?)://)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$%uiS', $url)) {

    return false;
}


//if the url is valid, we "curl it" and expect to get a 200 header response in order to validate it.

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body (faster)
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); // we follow redirections
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);


if($httpcode == "200"){
    return true;
}else{
    return false;
}


}

【讨论】:

  • 谢谢,不用获取正文,响应速度更快。我会坚持这个,除非我找到比这个更快的东西:)
【解决方案2】:

http://example 是一个有效的 url - 如果您的本地网络上有一台名为 example 的计算机。

您想要的唯一解决方案(特别是考虑到有很多新的顶级域)是连接并查看您是否获得 200 OK。

CURL 可能是这里最好的解决方案。

这个superuser 问题可能有助于从 url 获取响应代码。

但是你永远不会得到 100% 的准确率

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-10-31
    相关资源
    最近更新 更多