PHP中如何检查一个字符串是否只包含URL

53

我想知道这是否是一种正确的方式来检查一个字符串是否仅包含URL:

if (stripos($string, 'http') == 0 && !preg_match('/\s/',$string)) {
  do_something();
}

stripos()函数检查字符串是否以“http”开头
preg_match()函数检查字符串是否包含空格

如果不是这样,我假设该字符串仅为URL - 但是这个假设有效吗?有更好的方法来实现这个吗?


2
可能是如何检查URL是否有效的最佳方法?的重复问题。 - trejder
3个回答

161
使用filter_var()函数。
if (filter_var($string, FILTER_VALIDATE_URL)) { 
  // you're good
}

过滤器可以更加精细。请参阅手册 以获取更多信息。

非常感谢!(我觉得两个答案同时出现了) - yotka
谢谢,这比parse_url($string)更好,因为任何带有冒号(:)的内容都会被识别为url。效果更好。但是希望能够检测出即使没有http://也是url的方法。 - alexander7567
1
这无法成功验证一个包含字符 å 的URL,但是该URL正在工作。(使用PHP 7.0) - TheStoryCoder
1
无法验证包含%字符的有效URL。 - Kyle KIM

10

1
为了更安全地验证URL(包括那些“非ASCII”字符的URL),您可以:
  1. Check with the filter (be sure to check the manual on which filter suits your situation)

  2. Check to see if there are DNS records

    $string = idn_to_ascii($URL);
    if(filter_var($string, FILTER_VALIDATE_URL) && checkdnsrr($string, "A")){
        // you have a valid URL
    } 
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接