Php 如何确保字符串包含有效/格式正确的url?

Php 如何确保字符串包含有效/格式正确的url?,php,validation,url,Php,Validation,Url,如何确保字符串包含有效/格式正确的url 我需要确保字符串中的url格式正确 它必须包含http://或https:// 和.com或.org或.net或任何其他有效扩展名 我尝试了在SO中找到的一些答案,但所有答案都认为“www.google.com”是有效的 在我的例子中,有效的url必须是http://www.google.com或https://www.google.com www.部分不是义务,因为有些URL不使用它。您可以使用phpfilter\u var函数来实现这一点 $vali

如何确保字符串包含有效/格式正确的url

我需要确保字符串中的url格式正确

它必须包含
http://
https://

.com
.org
.net
任何其他有效扩展名

我尝试了在SO中找到的一些答案,但所有答案都认为“www.google.com”是有效的

在我的例子中,有效的url必须是
http://
www.google.com或
https://
www.google.com


www.
部分不是义务,因为有些URL不使用它。

您可以使用php
filter\u var
函数来实现这一点

$valid=filter_var($url, FILTER_VALIDATE_URL)

if($valid){
//your code
}

您可以使用php
filter\u var
函数来实现这一点

$valid=filter_var($url, FILTER_VALIDATE_URL)

if($valid){
//your code
}

请看下面的答案:

filter\u var()
可能适合您,但如果您需要更强大的功能,则必须使用正则表达式

此外,使用中的代码,您可以加入任何适合您需要的正则表达式:

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

Then, the correct way to check against the regex list as follows: 

<?php 
       if(preg_match("/^$regex$/", $url)) 
       { 
               return true; 
       } 
?>

然后,检查正则表达式列表的正确方法如下:

在这里查看答案:

filter\u var()
可能适合您,但如果您需要更强大的功能,则必须使用正则表达式

此外,使用中的代码,您可以加入任何适合您需要的正则表达式:

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

Then, the correct way to check against the regex list as follows: 

<?php 
       if(preg_match("/^$regex$/", $url)) 
       { 
               return true; 
       } 
?>

然后,检查正则表达式列表的正确方法如下:

有一种卷曲解决方案:

function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
还有一个fopen解决方案(如果您没有

function url_exists($url) {
    $fp = @fopen('http://example.com', 'r'); // @suppresses all error messages
    if ($fp) {
        // connection was made to server at domain example.com
        fclose($fp);
        return true;
    }
    return false;
}

有一个旋度解决方案:

function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
还有一个fopen解决方案(如果您没有

function url_exists($url) {
    $fp = @fopen('http://example.com', 'r'); // @suppresses all error messages
    if ($fp) {
        // connection was made to server at domain example.com
        fclose($fp);
        return true;
    }
    return false;
}
filter\u var($url,filter\u VALIDATE\u url)
可首先用于确保处理的是有效的url

然后,您可以通过假设URL确实有效来测试更多条件:

filter\u var($url,filter\u VALIDATE\u url)
可首先用于确保处理的是有效的url

然后,您可以通过假设URL确实有效来测试更多条件:


FILTER\u VALIDATE\u URL不可接受,因为它上面的“localhost”是一个有效的URL,但不能在我的系统上。FILTER\u VALIDATE\u URL不可接受,因为它上面的“localhost”是一个有效的URL,但不能在我的系统上。是的,但我没有足够的知识来制作一个正则表达式来满足我的需要。但它在链接的答案中是正确的:)是的,但是在链接中的这个表达式上,http部分是可选的,我需要那个部分。谢谢,我将
“((https?| ftp)\:\/\/)?;//SCHEME
更改为
”(https?| ftp)\:\/\/”//SCHEME
强制。现在看起来没问题。是的,但是我没有足够的知识来制作正则表达式来满足我的需要。但是链接的答案是正确的:)是的,但是在链接的这个表达式上,http部分是可选的,我需要那个部分。谢谢,我更改了
“((https?\ftp)\:\/\/)?;///方案
“(https?| ftp)\:\/\/\/”;//方案
,使其成为强制性方案。看起来现在很好。你能解释一下如何使用它吗?@LucasMatos我相信我的例子很清楚。有什么你不明白的吗?你能解释一下如何使用它吗?@LucasMatos我相信我的例子很清楚。有什么你不明白的吗?