регулярка - проверка url

kolyazdv

Новичок
регулярка - проверка url

Подскажите где неправильно сделал

if (eregi("^((news|telnet|nttp|file|http|ftp|https)://){0,1}(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][-A-Z0-9_]*)+):)(\d+))?\/?",$_POST['sys_url'])===false)
{
ошибка
}

пропускает урл где во-второй части встречаются кавычки :(

http://kolyazdv_nn.d'e'v.tes''t - пропускает
 

Фанат

oncle terrible
Команда форума
мне кажется, оно будет пропускать кучу всего, из-за {0,1}
 

Духовность™

Продвинутый новичок
какой смысл в проверке URL исключительно вида протокол//домен.порт? А query string? А кодирование? А специфические URL и кириллистические?
 

kolyazdv

Новичок
Автор оригинала: *****
мне кажется, оно будет пропускать кучу всего, из-за {0,1}
регулярку писал не я, но мне нужно устранить проблему... кое-что и для меня не прозрачно

Автор оригинала: triumvirat
А query string? А кодирование? А специфические URL и кириллические?
это проверять не нужно... именно как вы сказали нужно проверить

Автор оригинала: triumvirat
протокол//домен.порт
самое интерсное... что в первой части(до точки проверяет нормально) а после точки и первого символа проверка не выполняется... А не могу разобратся где кроится ошибка

-~{}~ 08.06.09 11:47:

1) ^((news|telnet|nttp|file|http|ftp|https)://){0,1} - может быть 1н раз - может не быть

2)(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+) - проверка самого имени... тут ошибка

3) ( :(\d+)) - проверка порта
 

Фанат

oncle terrible
Команда форума
лично я бы вообще не понтовался и не проверял ничего.
 

Духовность™

Продвинутый новичок
Ну проверять надо хотя бы на недопустимость абракадабры в текстовом поле. А так, да. У меня функция проверки выглядит так:

PHP:
function is_correct_url($in)
{
    $url_pattern = "#^
    (?:
        ([a-z]+)://(?:www\.)?
        ([a-z0-9.\-]+)
        (:[0-9]+)?
        (/\S+)?
    )
    $#xi";

    return preg_match($url_pattern, $in);
}
 

Фанат

oncle terrible
Команда форума
у меня (для замены) такой паттерн '!(\s+)(http://\S+[^\s.,\'">])!'
если не для пальцев, а для жизни, то вполне хватает
 

kolyazdv

Новичок
preg_match("/^(news|telnet|nttp|file|http|ftp|https):\/\/([0-9a-z\-\_]{1,32}\.){1,32}([0-9a-z\-\_]){2,32}:)(\d+))?(\/.*)*$/i",$_POST['sys_url'])

получилось так... правда с диапазоном чучуть не уверен может быть можно и больше 32 :)
 

kolyazdv

Новичок
preg_match("/^((news|telnet|nttp|file|http|ftp|https):\/\/){0,1}((([0-9a-z\-\_]+)\.)+)(([0-9a-z\-\_])+):)(\d{1,5}))?(\/([0-9a-z\-\_]*))*$/i",$_POST['sys_url'])==false)

а так :)

а выше делаю проверку mb_strlen($_POST['sys_url'])>254
 

Духовность™

Продвинутый новичок
что а так? возьми, оформи свой мегакод в функцию и посмотри, насколько он бесполезный - набери кучу разных URL с интернета и тести. А URL в интернете какие только уже не встретишь. Как только наткнешься на факт того, что твое регулярное выражение не пропускает кучу URL адресов, тогда подымись несколькими постами выше и посмотри на данные тебе регулярки по определению URL.

а выше делаю проверку mb_strlen($_POST['sys_url'])>254
зачем?
Протокол HTTP не устанавливает каких-либо ограничений на длину URI. Серверы должны быть способны обрабатывать URI любых ресурсов, имеющих любую длину. Сервер должен выдать отклик 414 (Request-URI Too Long - URI запроса слишком длинен), если URI длиннее, чем может обработать сервер (см. раздел 9.4.15).

Замечание: Серверы должны избегать использования URI длиннее 255 байт, так как некоторые старые клиенты или прокси-приложения не могут корректно работать с такими длинами.
 
Сверху