#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
😉