检查字符串是不是为 URL [重复]

Posted

技术标签:

【中文标题】检查字符串是不是为 URL [重复]【英文标题】: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检查之外,还有其他方法吗?

【问题讨论】:

【参考方案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 字符,所以请注意...

【讨论】:

我建议查看 GET 查询。没有解析 youtube 链接。我需要进行一些更改以使它们基于:***.com/questions/23959352/…【参考方案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。

【讨论】:

以上是关于检查字符串是不是为 URL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是为有效数字的逻辑[重复]

检查字符串是不是为有效 URL 的最佳正则表达式是啥?

在python中检查字符串是不是为数字[重复]

检查字符串时间范围现在是不是为[重复]

如何检查字符串是不是能够转换为 float 或 int [重复]

如何在python中检查字符串是不是为空[重复]