2015-08-20 3 views
2

Интересно, что было бы лучшим способом в PHP, чтобы проверить, при условии, гиперссылка действительна ... Сначала я попытался с:проверка 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, я думаю ... так что бы вы предложили? Вернитесь к традиционным regexp?

+0

Да, я бы сказал, регулярное выражение путь. Существует множество шаблонов для проверки URL-адресов, поэтому, если вы не хотите писать их самостоятельно, вы все равно найдете их. – treegarden

+0

Это зависит от того, что вы подразумеваете под «действительным». Должен ли он существовать, то есть успешно отвечать на запросы? В этом случае [ссылка] (http://php.net/manual/en/function.get-headers.php) может быть тем, что вы ищете. – raute

+0

Я просто хочу проверить, может ли реферер определить, должен ли я что-то отображать или нет. Но возможно, что в момент ввода конфигурации такая ссылка не будет существовать (т. Е. Какой-то сайт будет выпущен в ближайшем будущем, а администратор хочет что-то заранее настроить) – Moby04

ответ

3

Я рекомендую, чтобы вы не использовали 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).

0

Используйте этот

<?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

это не будет принимать www.google.pl например :) – Moby04

+0

Вам нужно добавить 'pl' здесь, как этот' biz | se | pl' –

+2

Я знаю ... но знаете ли вы, сколько доменов верхнего уровня вам нужно будет перечислять таким образом? – Moby04

Смежные вопросы