[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не работает регулярка
alex12060
В общем, скажу честно, решил не изобретать велосипед и взял готовое решение с нета.

Здесь представлена крутая регулярка на крутую проверку урл, но. она не пахает.

Ну, пахает, но всегда выдает ложь, даже при вводе http://vk.com/


public static function checkURI($file) {
$regular = '^#(https?|ftp|telnet)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+'.
'(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?'.
'(#[a-z_.-][a-z0-9+\$_.-]*)?\$#iu';

return preg_match($regular, $file);

}


Выдержка из своего проекта, "работает" криво. Подскажите, что с ней не так? Или дайте хорошую регулярку для моего случая..

Делаю мини скрипт вида wget для линуха, чтобы качать файлы с нета и сохранять их. В общем, нужно валидировать ссылку для скачивания.

Заранее спасибо.

З.Ы - ошибок вроде не нашел в паттерне, да и все пишут, что работает она на ура.



Спустя 22 минуты, 30 секунд (28.06.2011 - 20:23) Winston написал(а):
Цитата (alex12060 @ 28.06.2011 - 20:00)
ошибок вроде не нашел в паттерне

Опять не почитал про регулярные выражения? Ты не выполнил домашнее задание user posted image Садись, два ! :D

По теме сходу увидел 2 ошибки это в первой строке паттерна '^# а надо '#^
И это '(#[a тогда хотя бы уже так '(\#[a

Вот я ее немного подправил, вроде работает

    // Я тестировал на таких адресах. Пробуй :)
//$text = "http://phpforum.ru/index.php?showtopic=47331&hl=";
//$text = "http://google.ru/";
//$text = "http://www.sql.ru/docs/sql/u_sql/ch12.shtml";
//$text = "http://www.google.ru/search?source=ig&hl=ru&";
//$text = "vk.com";


$pattern = '#^(?:(https?|ftp|telnet)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+'.
'(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?'.
'(\#[a-z_.-][a-z0-9+\$_.-]*)?$#iu';

if(preg_match($pattern, $text, $mt))
echo 'OK';
else
echo 'BAD';

echo '<br/>';

print_r($mt);
echo '<br/>';
echo $mt[0];

Спустя 14 минут, 10 секунд (28.06.2011 - 20:37) alex12060 написал(а):
PHPprogramer

Да, спасибо, подправил)
Но все равно на выходе фалс выдает. Что за смрад? Оо

Спустя 3 минуты, 17 секунд (28.06.2011 - 20:40) Winston написал(а):
Цитата (alex12060 @ 28.06.2011 - 20:37)
Но все равно на выходе фалс выдает

blink.gif Ссыль можешь дать, на какой проверяешь

Спустя 4 минуты, 24 секунды (28.06.2011 - 20:45) alex12060 написал(а):
PHPprogramer

http://95.52.170.242/proxy/

На, смотри)
Там нажимай на энтер как вставишь.

Спустя 4 минуты, 10 секунд (28.06.2011 - 20:49) Winston написал(а):
:blink: Не поверишь, но у меня работает.
Вот такой код я написал
Свернутый текст
$text = "http://95.52.170.242/proxy/";    
function checkURI($file) {
$regular = '#^(?:(https?|ftp|telnet)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+'.
'(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?'.
'(\#[a-z_.-][a-z0-9+\$_.-]*)?$#iu';

return preg_match($regular, $file);
}

if(checkURI($text))
echo 'OK';
else
echo 'BAD';

Спустя 4 минуты, 19 секунд (28.06.2011 - 20:53) alex12060 написал(а):
PHPprogramer

Я тебе верю)
Даже не знаю в чем дело оО
Попробую пересмотреть свой код.

Спустя 5 минут, 40 секунд (28.06.2011 - 20:59) Winston написал(а):
Я не такой знаток ООП, но может проблема в этом ?
Цитата (alex12060 @ 28.06.2011 - 20:00)
static

Мне кажется статик не может ничего возвращать? (Или я ошибаюсь ?)

Спустя 32 секунды (28.06.2011 - 20:59) bulgakov написал(а):
И в чем же дело? Просто интересно.

Спустя 2 минуты, 1 секунда (28.06.2011 - 21:01) bulgakov написал(а):
Цитата
Мне кажется статик не может ничего возвращать? (Или я ошибаюсь ?)

А сами человеку двойки за регулярки ставите) двойка вам за ООП) Доступ к статическим методам или свойствам или константам класса осуществалется по типу:

NameClass::static_method();

Спустя 1 минута, 28 секунд (28.06.2011 - 21:03) alex12060 написал(а):
bulgakov
PHPprogramer


Нет, не в static.
Я просто кривоглазый smile.gif

У меня переплелась сначала переменная $file с внутренними (не, не правда)

В общем, сначала была кривая регулярка, а потом я забыл поменять с $pattern на $regular

Спасибо всем smile.gif

Спустя 1 минута, 7 секунд (28.06.2011 - 21:04) bulgakov написал(а):
А уж возвращать или не возвращать что-то то для этого как и в обычных функциях return, а вот если бы метод был объявлен в классе как private static function method_name() тогда доступ к нему напрямую был бы запрещен.

Спустя 1 минута, 14 секунд (28.06.2011 - 21:05) Winston написал(а):
Цитата (bulgakov @ 28.06.2011 - 21:01)
двойка вам за ООП

Согласен, что за ООП мне 2, плохо я его знаю sad.gif
Цитата (bulgakov @ 28.06.2011 - 21:01)
Доступ к статическим методам или свойствам или константам класса осуществалется по типу

Это я знаю, просто думал, что он не может ничего возвращать. Только что проверил. И у меня работает та ф-я что у alex12060'a только с подправленным паттерном.

Спустя 1 минута, 37 секунд (28.06.2011 - 21:07) Winston написал(а):
Цитата (alex12060 @ 28.06.2011 - 21:03)
Нет, не в static.
Я просто кривоглазый

smile.gif

Спустя 1 час, 45 минут, 55 секунд (28.06.2011 - 22:53) Invis1ble написал(а):
alex12060
Как насчет:
$url = 'http://95.52.170.242/proxy/';
$is_url = (bool)filter_var($url, FILTER_VALIDATE_URL);

? :)

Спустя 23 минуты, 46 секунд (28.06.2011 - 23:17) bulgakov написал(а):
Вот я знал что есть подобная функция просто не там в мануале искал) Спасибо за наводку) А то понаписывали тут регулярок ненужных)) Да здравствуют "новые старые" велосипеды)

Спустя 5 минут, 20 секунд (28.06.2011 - 23:22) Invis1ble написал(а):
bulgakov
Самое интересное - в нете полно подобных извращений, и все соревнуются, кто круче регэксп составит smile.gif
Недавно наткнулся на одну статейку, там про IP шла речь, статья довольно познавательная, но в ней было подобное извращение - автор написал функцию с регуляркой для валидации IP-адреса. И зачем спрашивается, когда есть filter_var($ip, FILTER_VALIDATE_IP) ? smile.gif

Спустя 7 минут, 1 секунда (28.06.2011 - 23:29) bulgakov написал(а):
Во во, я тоже когда смотрю на темы с названиями типа - Помогите с регуляркой, читаю проблему и лезу искать как это решить с помощью функци, большинство регулярок заменяются простейшими функциями, просто не привыкли думать что велосипеды за нас уже написали)

Спустя 9 часов, 40 минут, 30 секунд (29.06.2011 - 09:09) alex12060 написал(а):
Invis1ble

А Вы в курсе, что filter_var() доступна с 5 версии, а доработана уже с версии 5.2 ?

(PHP 5 >= 5.2.0)

Я давно смотрел на эту функцию, но она сильно ограничивает круг пользователей smile.gif
Подожду до 6 пхп, далее уже можно будет использовать и ее)

Спустя 9 минут, 6 секунд (29.06.2011 - 09:18) Invis1ble написал(а):
alex12060
В курсе, а ты работаешь с 4-й версией ? blink.gif

Спустя 2 минуты, 21 секунда (29.06.2011 - 09:21) alex12060 написал(а):
Нет)

Но все-же)
Хотя, у меня один конструктор уже чего стоит с инкапсуляцией smile.gif

Ладно, посмотрим)

Спустя 57 минут, 18 секунд (29.06.2011 - 10:18) bulgakov написал(а):
Насчет 6 версии, 5.3 это и есть 6 версия только без поддержки юникода, команда по разработке 6 версии вроде разбежалась, поэтому ходят слухи что 6 не будет а будет сразу 7. Так что версия 5.3 это уже и есть 6.

Спустя 41 минута, 34 секунды (29.06.2011 - 11:00) DedMorozzz написал(а):
первый пост...
Цитата
(https?|ftp|telnet)\
Здесь допускаються ЮРЛ начинающийся с
https,ftp,telnet
Т.е. адресс хттп: - уже не подходит. Кроме того, если без хттп - тоже. Выкинь её, иль засунь откуда взял smile.gif

Спустя 8 минут, 6 секунд (29.06.2011 - 11:08) Invis1ble написал(а):
DedMorozzz
Цитата
Т.е. адресс хттп: - уже не подходит

от кого-кого, но от тебя, гуру регэкспов, я такого не ожидал.... smile.gif

Спустя 12 минут, 25 секунд (29.06.2011 - 11:20) DedMorozzz написал(а):
прочитал твой пост...Я слеп smile.gif Знак вопроса не увидел, а веть специально смотрел его. Глаз замыленый, как любит Твин говорить

Спустя 3 минуты, 33 секунды (29.06.2011 - 11:24) DedMorozzz написал(а):
всё равно, регулярка кривая smile.gif
1 - самое начало ^#(, должно быть так #^(. Сейчас указание границы До начала регулярки.
2 - [a-z0-9+!*(),;?&=\$_.-]+ это эквивалент просто [.]+, и остальные символы можно убрать. Но это крайне не логично, ибо в ЮРЛ таким образом может быть ВСЁ что угодно. И так в каждом блоке, спец знаки не экранированы
3 - адресс без http(s), ftp... не пройдёт, т.е. phpforum.ru - не валидно.
4 - ....и так далее


Нет смысла её фиксить, она убога, писалась какой-то калекой

Спустя 46 секунд (29.06.2011 - 11:25) Invis1ble написал(а):
Цитата
Глаз замыленый

Да знаю, бывает )
Насчет кривости регулярки - это точно
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.