Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > универсальный regexp url


Автор: necrom 27.7.2011, 20:48
Помогите дописать универсальный regexp для проверки url.
Необходимо, чтобы регулярка искала все комбинации вида.
Код

Запрос                                              Результат1        Результат2
http://yandex.ru                              - yandex.ru         yandex.ru
http://yandex.ru/                            - yandex.ru         yandex.ru
http://yandex.ru/?q=search/                - yandex.ru         yandex.ru/?q=search


Но, не пропускала вот такие последовательности
Код

http://yandex.ru/?q=search/test

Текущий RegExp сейчас такой. Работает почти, как надо, но пропускает, последовательности которые описаны выше и не убирает слеши с конца.
Код

regUrl.set_expression("(?:http://)?/?(([_a-zA-Z\\d\\-]+(?:\\.[_a-zA-Z\\d\\-]+)+)/?([_a-zA-Z\\d\\-\\[\\]\\?\\.=%&;#]+)?)");

Автор: rudvil 28.7.2011, 13:31
Код

^http:\/\/(yandex\.ru(\/\?q=\w+)?)?\/?$

Эти принимает
Код

http://yandex.ru
http://yandex.ru/
http://yandex.ru
http://yandex.ru/
http://yandex.ru/?q=search
http://yandex.ru/?q=search/

Эти нет
Код

http://yandex.ru/?q=search/test
http://yandex.ru/?q=search/testasdasdadsasdasdasd

Результат в \1 или $1.
http://regexr.com?2ub3h

Автор: bsa 28.7.2011, 17:28
rudvil, вот только слову "универсальный" не соответствует

Автор: necrom 28.7.2011, 21:55
Цитата(rudvil @ 28.7.2011,  13:31)
Код

^http:\/\/(yandex\.ru(\/\?q=\w+)?)?\/?$

Эти принимает
Код

http://yandex.ru
http://yandex.ru/
http://yandex.ru
http://yandex.ru/
http://yandex.ru/?q=search
http://yandex.ru/?q=search/

Эти нет
Код

http://yandex.ru/?q=search/test
http://yandex.ru/?q=search/testasdasdadsasdasdasd

Результат в \1 или $1.
http://regexr.com?2ub3h

Тут http://yandex.ru чисто для примера, там может быть любой домен. Не катит в общем, ещё есть варианты?

Автор: rudvil 28.7.2011, 22:44
Цитата(bsa)

rudvil, вот только слову "универсальный" не соответствует

Цитата(necrom)

Тут http://yandex.ru чисто для примера, там может быть любой домен. Не катит в общем, ещё есть варианты?

делов то, поменять yandex на \w+
Код

^https?:\/\/(\w+(\.\w+)+(\/\?\w+=\w+)?)?\/?$

http://regexr.com?2ub8v

Автор: necrom 8.8.2011, 03:40
Хех почти, вот такие не ищет  smile 
Код

https://illegal.site.com/auto/?test=a

Автор: rudvil 8.8.2011, 08:40
Цитата(necrom @ 8.8.2011,  03:40)
Хех почти, вот такие не ищет  smile 
Код

https://illegal.site.com/auto/?test=a

Код
^https?:\/\/(\w+(\.\w+)+(\/\w+)*(\/\?\w+=\w+)?)?\/?$

http://regexr.com?2udc0

Автор: phprus 8.8.2011, 10:06
Нужно парсить просто URLы или доставать их из текста? Если парсить URLы, то может-быть проще воспользоваться готовой библиотекой, например http://code.google.com/p/google-url/ ?

Автор: necrom 12.8.2011, 17:22
Нужно парсить текст.
Немного доработал под себя спасибо, всем кто помогал.
Код

^(?:http:)?\/?\/?(([\w\-]+(?:\.\w+)*)((?:\/[\w\-]+)*?(?:\/(?:\w+(?:\.\w+)+)?(?:[\[\]\?\.\=%&;#]+\w+)*)?))?\/?$


Появилась не большая проблема, почему то boost выдаёт кривой результат, если нет обозначения начала и конца строки. В чём может быть проблема?

Код

    string url("http://Yandex.fdfdf.d1fdf/slesh-sd/kjkl.php=?ygfh-jhgjh");
    boost::regex regUrl;
    regUrl.set_expression("(?:http:)?/?/?([-\\w]+[\\.\\w]+)((?:/[-\\w]+)*(?:/(?:[-\\w]+[\\.\\w]+)?(?:[\\[\\]\\?\\.\\=\\-%&;#]+\\w+)+)?)?/?");

    boost::sregex_iterator xInvalidIt;
    boost::sregex_iterator i(url.begin(), url.end(), regUrl);
    if(i != xInvalidIt){
        cout << i->str(0) << endl;
        cout << i->str(1) << endl;
        cout << i->str(2) << endl;
        cout << i->str(3) << endl;
    }

Автор: necrom 15.8.2011, 17:24
Хелп, boost кодеры ) Ещё одна проблема, как сделать если в полностью текст до пробелов не совпадает, он его бы пропускал предположим идёт http://yandex.ru/?q=search/test обрамлённый двумя пробелами спереди и с зади, он не соответствует полностью патерну, он его пропускает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)