Как на стороне клиента PHP проверить, действителен ли URL веб-сайта?

#php #validation #url #client-side

#php #проверка #url #на стороне клиента

Вопрос:

Я просмотрел наши вопросы SO, но найденные решения основаны на вызове ping команды, выполняемой с помощью system функции PHP.

Мой сервер веб-хостинга не позволяет мне этого делать. Что мне делать?

Пожалуйста, помогите, Nam.

Примечание

Мне нужно проверить со client/web-browser стороны.

Комментарии:

1. Что вы подразумеваете под проверкой URL на стороне клиента?

Ответ №1:

Поскольку вы не можете загрузить внешнюю веб-страницу с помощью ajax, чтобы проверить, отвечает ли страница, вы можете сделать следующее:

  • Сначала проверьте, действительна ли вообще строка URL, используя regexp:

javascript:

Отредактировано, чтобы быть НАМНОГО более снисходительным. Поскольку javascript не поддерживает сопоставление символов Unicode без каких-либо сторонних библиотек, я выбрал именно этот подход:

 function Validate(url){ 
    var pattern = /(https?://)?. .[a-z]{2,4}/i 
    return pattern.test(url); 
} 

alert(Validate("http://abcü好le2.com/?query=testamp;test=1")); //true
alert(Validate("https://hurmårdu.se/blog/?test=1")); //true
alert(Validate("abcü好le2.com/?query=testamp;test=1")); //true
alert(Validate("hurmårduse/blog/?test=1")); //false
alert(Validate("hurmårduse")); //false
  

Примечание: Чтобы сделать эту функцию еще лучше, мы можем добавить поддержку добавления http: // в начале строки, если она его не содержит. Также, если вас интересует регулярное выражение в юникоде: http://xregexp.com/plugins

  • Если да, то отправьте ajax-запрос на свой серверный сервер
  • Серверная часть принимает URL, отправленный с ajax-запросом, и загружает URL либо с помощью решения, предоставленного вам Flave, либо, и возвращает, является ли URL адаптивным или нет:

php:

 $url = $_POST["url"];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);       
curl_close($ch);
if(strlen($output)){
    return json_encode(array("is_valid" => true, "value" => $url));
}else{
    return json_encode(array("is_valid" => false, "value" => $url));
}
  

Примечание: коду требуется очистка данных, отправленных из запроса ajax.

Комментарии:

1. Регулярные выражения слишком подвержены ошибкам при проверке URL-адресов. Например, ваш шаблон не поддерживает umlauts. Я не рекомендую использовать регулярное выражение. Кроме того, вы не будете знать, используется ли этот URL.

2. Ну, здесь мы не полагаемся на регулярное выражение, это просто средство для сортировки недопустимых URL-адресов вместо того, чтобы тратить ресурсы на фактическую загрузку URL. Также мы можем адаптировать регулярное выражение, чтобы оно было более гибким, поэтому мы просто сортируем URL-адреса, в которых есть серьезные ошибки.

Ответ №2:

Ваш хост позволяет использовать функции curl или socket ()? Или, возможно, выполнение удаленного включения с помощью команды fopen? Вероятно, это гораздо лучшая альтернатива, чем использование команды system («ping»).

Ответ №3:

простая проверка в php будет

 if(strlen(file_get_contents('http://google.com')){ // do something }
  

на стороне клиента может быть сложно, потому что большинство браузеров не допускают сквозных сценариев

в качестве альтернативы вы могли бы использовать php-curl, если он установлен.

Ответ №4:

Функция gethostbyname and checkdnsrr (эта не реализована в Windows) проверит, соответствует ли данное имя хоста записи DNS (то есть, по сути, является ли данное имя хоста общедоступным). Это должно быть быстрее, чем file_get_contents и curl 😉