检查字符串是否为URL

时间:2012-03-08 18:41:56

标签: php regex url

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

如果我们有文字,不论它是什么,我想检查它是否是一个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检查吗?

8 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:20)

以下代码对我有用:

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
}

您还可以使用标记指定RFC合规性和URL的其他要求。有关详细信息,请参阅PHP Validate Filters

答案 2 :(得分:16)

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; 
       } 
?>

但您的示例网址已过度简化,(\w+)\.(\w+)会与之匹配。有人提到filter_var这只是一个filter_var($url, FILTER_VALIDATE_URL),但它是doesn't seem to like non-ascii个字符,所以要小心......

答案 3 :(得分:5)

检查它是否是有效网址(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

答案 4 :(得分:4)

正则表达式是一种很难验证像URL一样复杂的东西的方法。

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

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

如果你有一些文字。而不是大量的。您可以通过执行CURL请求进行检查,看看是否返回有效响应。否则,如果我把localhost,它可能是一个链接,它可能是其他东西,你将无法检查它。

答案 7 :(得分:1)

可能对你有用的东西:

$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作为返回值的地方就是你的无效网址。