【问题标题】:check if a string is a URL [duplicate]检查字符串是否为 URL [重复]
【发布时间】:2012-03-26 06:02:24
【问题描述】:

我看过很多问题,但无法理解它是如何工作的 因为我想要一个更简单的案例。

如果我们有文本,不管它是什么,我想检查它是否是一个 URL。

$text = "something.com"; //this is a url

if (!IsUrl($text)){
    echo "No it is not url";
    exit; // die well
}else{
    echo "Yes it is url";
    // my else codes goes
}

function IsUrl($url){
    // ???
}

在JS被阻塞的情况下,除了用JavaScript检查之外,还有其他方法吗?

【问题讨论】:

    标签: php regex url


    【解决方案1】:

    下面的代码对我有用:

    if(filter_var($text, FILTER_VALIDATE_URL))
    {
        echo "Yes it is url";
        exit; // die well
    }
    else
    {
        echo "No it is not url";
       // my else codes goes
    }
    

    您还可以使用标志在 URL 上指定RFC 合规性和其他要求。详情请见PHP Validate Filters

    【讨论】:

    • 您的第一行应该检查是否为假,因此实际上是 if(!filter_var($text, FILTER_VALIDATE_URL)) 或翻转您的 if/else。
    • 谢谢嘉莉,回声信息确实被翻转了。我已经修好了。
    • 如果有人尝试使用example.com,它只会覆盖完整的URL,如example.com,它不会检测到。
    【解决方案2】:

    PHP 的filter_var 函数正是您所需要的。寻找FILTER_VALIDATE_URL。您还可以设置 flags 来微调您的实现。
    不需要正则表达式....

    【讨论】:

    • 但是,只有在 URL 前使用 http 时才适用。例如,www.google.com 将无法正确验证。
    • 从技术上讲,根据 URL(或 URI)的定义,它需要一个协议(http、https 等)作为字符串中的第一件事。您所描述的只是完整 URL 的域和路径部分。
    • www.google.com 我认为这不是一个完整的网址。但是如果你想要一个聪明的方法。使用正则表达式。
    【解决方案3】:

    http://www.php.net/manual/en/function.preg-match.php#93824

    <?php 
        $regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
        $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
        $regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP 
        $regex .= "(\:[0-9]{2,5})?"; // Port 
        $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
        $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
        $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 
    
           if(preg_match("/^$regex$/i", $url)) // `i` flag for case-insensitive
           { 
                   return true; 
           } 
    ?>
    

    但您的示例 URL 过于简化,(\w+)\.(\w+) 会匹配它。其他人提到了filter_var,它只是一个filter_var($url, FILTER_VALIDATE_URL),但它是doesn't seem to like non-ascii 字符,所以请注意...

    【讨论】:

    【解决方案4】:

    检查它是否是一个有效的网址(example.com 不是一个有效的网址)

        function isValidURL($url)
        {
            return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*
            (:[0-9]+)?(/.*)?$|i', $url);
        }
    

    如何使用该功能:

        if(!isValidURL($fldbanner_url))
        {
            $errMsg .= "* Please enter valid URL including http://<br>";
        }
    

    来源:http://phpcentral.com/208-url-validation-in-php.html

    【讨论】:

    • ftp://
    【解决方案5】:

    正则表达式是验证 URL 等复杂内容的糟糕方法。

    PHP 的filter_var() 函数提供了一种更可靠的方法来验证 URL。此外,它更快,因为它是本机代码。

    【讨论】:

    • 嗯?这个问题与 ASP.net 或 C# 无关。它专门询问如何在 PHP 中验证 URL。
    • 如果你看上面,原来的问题没有提到任何关于 PHP 的内容。如果有的话,它是在询问如何在不使用 JS 的情况下实现结果。因此,实际上,您的答案不适合所提出的问题。此外,对于非 PHP 问题,Jack 批准的答案不应该被打上绿色勾号,因为它是 PHP 答案。另一个 IMO 节制不佳的例子。
    • 问题被标记为“php”。提供的示例代码是 PHP。提问者可能应该更明确地提出他的问题 - 但从上下文中可以清楚地看出他正在尝试验证 URL 服务器端,并且使用 PHP 作为他的服务器端语言。我现在已经完成了这个愚蠢的论点:)
    【解决方案6】:

    我认为对此没有明确的答案。有效网址示例:

    localhost
    http://xxx.xxx.xxx/alkjnsdf
    abs.com
    

    如果你有一些文字。而且不是很多。您可以通过执行 CURL 请求来检查它是否返回有效响应。否则,如果我放 localhost,它可能是一个链接,也可能是其他东西,您将无法检查它。

    【讨论】:

    • 是的,我不在乎它是否有效,我只是想确保它不像 $text = "something blah blah blah";
    • 尝试其他人发布的一些解决方案,但仅仅因为它通过了正则表达式并不意味着它是一个有效的网址,例如a.com/a
    • 丘克一针见血。您对“有效 URL”的要求太低了,无法提供答案。听起来您只是想确保输入看起来可能是 URL 或主机名。如果是这种情况,你唯一能做的就是确保它不包含任何空格。
    【解决方案7】:

    您可以使用以下正则表达式模式来检查您的变量是否为 url:

    $pattern = "\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))";
    

    【讨论】:

    • 此代码不起作用
    • 编辑了答案
    【解决方案8】:

    类似的东西可能对你有用:

    $arr = array('abc.com/foo',
    'localhost',
    'abc+def',
    'how r u',
    'https://how r u',
    'ftp://abc.com',
    'a.b');
    foreach ($arr as $u) {
       $url = $u;
       if (!preg_match('#^(?:https?|ftp)://#', $url, $m))
          $url = 'http://' . $url;
       echo "$u => ";
       var_dump(filter_var($url, FILTER_VALIDATE_URL));
    }
    

    输出:

    abc.com/foo => string(18) "http://abc.com/foo"
    localhost => string(16) "http://localhost"
    abc+def => string(14) "http://abc+def"
    how r u => bool(false)
    https://how r u => bool(false)
    ftp://abc.com => string(13) "ftp://abc.com"
    a.b => string(10) "http://a.b"
    

    所以基本上无论你注意到false 作为返回值,它对你来说都是一个无效的 URL。

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 2015-05-22
      • 1970-01-01
      • 2015-04-21
      • 2014-07-06
      • 2016-02-18
      • 1970-01-01
      • 2019-06-06
      • 2023-03-31
      相关资源
      最近更新 更多