2012-03-08 18 views
10

我见过很多问题,但无法理解它是如何工作的 因为我想要一个更简单的情况。检查一个字符串是否为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来检查?

回答

15

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

<?php 
    $regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])?"; // 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字符的话,当心...

+1

我会建议查看GET查询。没有解析YouTube链接。我需要做一些改变,使他们的工作基础:http://stackoverflow.com/questions/23959352/validate-url-query-string-with-regex – 2016-05-03 11:25:11

5

检查它是否是一个有效的URL(example.com IS NOT有效的URL)

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

+0

ftp:// – ymakux 2017-10-28 19:29:18

1

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

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

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

+2

但是,只有在URL前面使用'http',这才是真实的。例如,www.google.com将不会被正确验证。 – 2014-08-05 10:34:32

+4

从技术上讲,根据URL(或URI)的定义,它需要协议(http,https等)成为字符串中的第一个东西。你所描述的只是整个URL的域和路径部分。 – enygma 2014-08-06 01:45:23

+0

www.google.com我认为这不是一个完整的网址。但是如果你想要一个聪明的方法。使用正则表达式。 – 2015-11-27 12:47:30

2

我不认为这是一个明确的答案。有效网址示例:

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

如果您有一些文字。而不是大量的。您可以通过执行CURL请求来查看是否返回有效的响应。否则,如果我把本地主机,它可能是一个链接,它可能是别的,你不能检查它。

+0

是的,我不在乎它是否工作,我只是想确保它不是像$ text =“东西等等等等等等”; – 2012-03-08 18:48:01

+0

尝试一些其他已发布的解决方案,但仅仅因为它通过正则表达式并不意味着它是一个有效的网址,例如http://a.com/a – Churk 2012-03-08 18:49:45

+0

Churk已经击中了头部。您对“有效的网址”的要求太少,无法提供答案。这听起来像你只是想确保输入看起来像它可能是一个URL或主机名。如果是这样的话,你唯一能做的就是确保它不包含任何空格。 – 2012-03-08 19:02:59

2

试试这个:

function isValidUrl($url) { 
    return preg_match("(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))", $url) > 0; 
} 

Regex source

+0

嗨,我用这个函数,但我得到这个错误“preg_match( ):未知的修饰符'\'“可以帮助你解决这个错误。 – 2014-10-24 18:37:58

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

OUTPUT:

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都是您的无效网址的返回值。下面

15

的代码为我工作:

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

+0

你的第一行应该检查false,所以它实际上是'if(!filter_var($ text,FILTER_VALIDATE_URL))'或者翻转你的if/else。 – 2014-02-14 21:05:40

+0

感谢嘉莉,确实回声消息被翻转。我修好了。 – user3078359 2014-02-24 17:51:11

4

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

PHP的filter_var()函数提供了一种更强大的验证URL的方法。另外,它更快,因为它是本地代码。

+2

咦?这个问题不是关于ASP.net或C#。它特别要求如何验证PHP中的URL。 – greenie2600 2015-03-20 19:51:21

+0

如果你在上面看,原来的问题没有提到有关PHP的任何内容。如果有什么要求的话,如何在不使用JS的情况下实现结果。所以实际上,你的回答不适合所问的问题。此外,杰克批准的答案不应该被赋予绿色标记,因为它是PHP的答案,对于非PHP问题。另一个适度的缓和IMO的例子。 – Fandango68 2015-03-24 01:00:56

+3

这个问题被标记为“php”。提供的示例代码是PHP。提问者可能应该对他的问题更加明确 - 但从上下文中可以清楚地看出他正在尝试验证URL服务器端,并将PHP用作其服务器端语言。而我现在完成了这个愚蠢的说法:) – greenie2600 2015-03-25 01:31:36

相关问题