как проверить урл на валидность?

12
seosniks
На сайте с 13.08.2007
Offline
389
6486

Подскажите пожалуйста, как проверять урлы на валидность.

перепробовал все регулярки что-то не выходит. Функция preg_match не срабатывает

if(preg_match( '/^([a-z0-9_-.])+(.([a-z0-9/])+)+$/' ,$url))

{
echo"ошибка";
}

Нужно проверять данные с формы на корректность.

В сети порылся регулярок куча, но не работают от чего то.:confused:

Еще пробовал ereg но он устаревший говорят.

bukachuk
На сайте с 07.09.2008
Offline
97
#1

define("URL_RX_HOST",' (?i: [a-z0-9] (?: [-a-z0-9]*[a-z0-9] )? \. )+(?: cat|jobs|mobi|pro|travel|

com|edu|gov|int|mil|net|org|biz|info|

name|museum|coop|aero|[a-z][a-z]

)');

function isValidUrl( $url ) {

return (boolean)preg_match(

'{^https?://'.URL_RX_HOST.'(?: /.* )? $}xi',

$url

);

}

Программирование PHP,Mysql (/ru/forum/934470)
N
На сайте с 06.05.2007
Offline
419
#2
Кнопка вызова админа ()
bukachuk
На сайте с 07.09.2008
Offline
97
#3
netwind:
функция есть : http://ru2.php.net/manual/ru/function.parse-url.php

Читаем:

This function is not meant to validate the given URL, it only breaks it up into the above listed parts. Partial URLs are also accepted, parse_url() tries its best to parse them correctly.

N
На сайте с 06.05.2007
Offline
419
#4

это понятно, но ее все же можно использовать :

если развалить url на части и собирать заново из частей и сравнить как строчку.

думаю будет довольно шустро работать, ведь она написана на языке низкого уровня С .

bukachuk
На сайте с 07.09.2008
Offline
97
#5
netwind:
это понятно, но ее все же можно использовать :
если развалить url на части и собирать заново из частей и сравнить как строчку.
думаю будет довольно шустро работать, ведь она написана на языке низкого уровня С .

Сомневаюсь, что это будет проще и возможно врядли будет быстрее.

seosniks
На сайте с 13.08.2007
Offline
389
#6
netwind:
это понятно, но ее все же можно использовать :
если развалить url на части и собирать заново из частей и сравнить как строчку.
думаю будет довольно шустро работать, ведь она написана на языке низкого уровня С .

Самое проще это регуляным выражением с пощью preg_match

Но вот у меня не выходит что то.

нужно задать шаблон

типа

http{s}://{www}[A-Z-a-z][0-9].
Но я не силен в регулярках.

Указывать зону домена явно com|net|biz. и так далее, не стоит так как

тогда получиться несколько строчек кода.

Очень желательно чтобы в поля e-mail и url были введены именно адрес электронной почты и адрес сайта соответственно, а не то, что душе угодно:

preg_match( '/^([a-z0-9_-.])+@([a-z0-9_-])+(.([a-z0-9])+)+$/' ,$email);

Такая запись устанавливает условие на содержимое переменной $email. Функция вернет true, если данные в переменной похожи на адрес электронной почты, false - в противном случае.

preg_match( '/^([a-z0-9_-.])+(.([a-z0-9/])+)+$/' ,$url);
Таким регулярным выражением можно проверить и url на правильность

У меня он что то не ловит мусор. тоесть пропускает все.

в общем решил сделать так

if(!eregi("^[A-z0-9А-я./-]{3,40}$", $url))

буквы цифры дефис и точка, а домен такие бывают типа

yandex_ss.ru
или только дефис может быть?
bukachuk
На сайте с 07.09.2008
Offline
97
#7

Второй ответ в топике посмотрите

lnx
На сайте с 26.07.2008
Offline
128
lnx
#8

В свое время тоже задавался этим вопросом, изучив кучу доков, написал вот такую регулярку, правда это C++ и boost, но сама регулярка может перебраться и на php

// Регулярка для выбора основных составных url

const boost::regex main_expression(
// PROTO HOST PORT
"^(\?:([^:/\?#]+)://)\?(\\w+[^/\?#:]*)(\?::(\\d+))\?"
// PATH FILE PARAMS
"(/\?(\?:[^\?#/]*/)*)\?([^\?#]*)\?(\\\?(.*))\?",
boost::regbase::normal | boost::regbase::icase);
З
На сайте с 24.04.2008
Offline
54
#9

У Вас в регулярке в качестве границ используется наклонный слэш, который также присутствует и в теле регулярного выражения. Замените его на вертикальный (|)

T.R.O.N
На сайте с 18.05.2004
Offline
314
#10
seosniks:
как проверять урлы на валидность.

а что для Вас валидный URL? или, вернее, какой из них может быть не валиден?

можно пойти самым простым путем. Запросить HEAD по этому пути и посмотреть, есть ошибка или нет?

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий