валидация URL — PHP проверяет правильность URL

Интересно, что было бы лучшим способом в php, чтобы проверить, если указанный URL-адрес является действительным … Сначала я попытался с:

filter_var($url, FILTER_VALIDATE_URL) === false

Но это не принимает www.example.com (без протокола). Итак, я попробовал с простой модификацией:

protected function checkReferrerUrl($url) {
if(strpos($url, '://') == false) {
$url = "http://".$url;
}
if(filter_var($url, FILTER_VALIDATE_URL) === false) {
return false;
}
return true;
}

Теперь он отлично работает с www.example.com но также принимает простые foo как он преобразуется в http://foo, Тем не менее, хотя это не действительный публичный URL, я думаю … так что бы вы предложили? Вернуться к традиционный регулярное выражение?

2

Решение

Я рекомендую, чтобы вы не использовали filter_var с типом URL.
Есть намного больше побочных эффектов.
Например, это допустимые URL-адреса в соответствии с filter_var:

http://example.com/"><script>alert(document.cookie)</script>
http://example.ee/sdsf"f

Кроме того, FILTER_VALIDATE_URL не поддерживает интернационализированные доменные имена (IDN).

Из соображений безопасности я рекомендую использовать регулярное выражение в сочетании с некоторыми ifs (например, для домена).
Без аспекта безопасности я использую parse_url, чтобы взять мои части. Но эта функция имеет аналогичную проблему, когда схема (без http / https) отсутствует.

3

Другие решения

Использовать этот

<?php
$url = 'www.example.com';

if(validateURL($url)){
echo "Valid";
}else{
echo "invalid";
}

function validateURL($URL) {
$pattern_1 = "/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";
$pattern_2 = "/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";
if(preg_match($pattern_1, $URL) || preg_match($pattern_2, $URL)){
return true;
} else{
return false;
}
}
?>

Попробуйте это тоже

<?php

// Assign URL to $URL variable
$url = 'http://example.com';

// Check url using preg_match
if (preg_match("/^(https?:\/\/+[\w\-]+\.[\w\-]+)/i",$url)){
echo "Valid";
}else{
echo "invalid";
}

?>
0

По вопросам рекламы [email protected]