быстрый вопрос о валидации URL - PullRequest
1 голос
/ 13 сентября 2010

Я действительно не хочу использовать curl или что-нибудь подобное.Я искал простой способ проверить, является ли URL-адрес (пользователь введет URL-адрес, а затем он будет сохранен в моей базе данных MySQL) действительным и является ли он действительным URL-адресом, т.е. домен существует.Является ли fopen хорошим решением?

Буду признателен за любые уроки или советы по этому вопросу.

Ответы [ 3 ]

5 голосов
/ 13 сентября 2010

CURL не так уж сложно.Чтобы получить http-статус URL:

$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.

2 голосов
/ 13 сентября 2010

Сначала убедитесь, что это действительный URL-адрес, используя filter_var():

<?php

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

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

Затем проанализируйте URL-адрес с помощью parse_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, даже если сервер может существовать. Альтернативное решение, которое будет проверять только имя хоста с DNS-серверов и вообще не подключаться, использует gethostbyaddr() и gethostbyname():

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

Ссылки:

  • filter_var() - Проверить строки
  • parse_url() - разбирает URL-адреса в массивы
  • fsockopen() - открывает сокетное соединение
  • gethostbyaddr() - получает доменное имя IP-адреса (хотя не уверен, поддерживает ли он IPv6)
  • gethostbyname() - получает IPv4-адрес доменного имени
0 голосов
/ 13 сентября 2010

Вы должны попробовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...