关于网址验证的快速问题

时间:2010-09-13 12:56:11

标签: php validation

我真的不想使用卷曲或任何复杂的东西。 我正在寻找一种简单的方法来检查url(用户是否输入url然后存储在我的MySQL数据库中)是否有效并且它是一个有效的URL,即域存在。 fopen是一个很好的解决方案吗?

非常感谢任何关于此的教程或提示。

3 个答案:

答案 0 :(得分:5)

CURL并不复杂。获取网址的http状态:

$ch = curl_init('http://www.yahoo.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($status >= 200 && $status < 400) {
    // url is valid
}

正则表达式或过滤器将验证url是否有效但不存在。 DNS查找验证域是否存在,但不验证URL。

答案 1 :(得分:2)

首先,使用filter_var()验证它是有效的网址:

<?php

$url = "http://www.example.com/foo.php";

if(!filter_var($url, FILTER_VALIDATE_URL))
{
  die('Invalid URL');
}

接下来,使用parse_url()解析URL并确保它是HTTP(S):

$p_url = parse_url($url);
if(!$p_url) // couldn't parse URL, since parse_url() cannot recognize it
{
  die('Invalid URL');
}
if($p_url['scheme'] != 'http' && $p_url['scheme'] != 'https')
{
  die('Invalid protocol (only HTTP(S) is supported)');
}

最后,检查主机是否存在以及您是否可以连接到主机。我选择在这里使用fsockopen(),因为它会检查主机名和端口,而不是实际发送HTTP请求。

$fp = fsockopen($p_url['host'], (isset($p_url['port']) ? $p_url['port'] : 80));
if($fp)
{
  echo 'Valid URL';
  fclose($fp); // Remember to close the file pointer
}else{
  echo 'Invalid server';
}

请注意,您可能希望避免使用此方法(取决于您希望应用程序执行的操作),就好像服务器已关闭一样,这将导致Invalid server,即使服务器可能存在。另一种解决方案是仅使用gethostbyaddr()gethostbyname()来检查DNS服务器中的主机名,而不是根本连接:

if(@gethostbyaddr($p_url['host'])) // IP addresses passes this test
{
  echo 'Valid URL';
}else{
  $host = $p_url['host'];
  $addr = gethostbyname($host);
  if(!$addr) // Invalid domain name
  {
    echo 'Invalid domain name';
  }else if($host == $addr) // Domain name could not be resolved (i.e. does not exist)
  {
    echo 'Invalid domain name';
  }else{
    echo 'Valid URL';
  }
}

链接:

答案 2 :(得分:0)

你应该尝试filter_var

<?php
$url = "http://www.example.com";

if(!filter_var($url, FILTER_VALIDATE_URL))
{
  echo "URL is not valid";
}
else
{
  echo "URL is valid";
}
?> 

阅读filter_var manual