ФорумПрограммированиеОбщие вопросы программирования → Регуляка, которая ловит строку для последующего split/explode

Регуляка, которая ловит строку для последующего split/explode

  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 7:27

    Есть конечный набор идентификаторов: id1, id2, id3 ... id100
    Как регуляркой поймать строки где какие-то из этих идентификаторы перечислены через разделитель в произвольном порядке. Например: id1_id2 или id2_id1 или id25_id1_id14_id8 итд
    Это вообще возможно?
    Опережая вопрос "Зачем?" отвечу: Для написания правила роутинга.

  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 15 апреля 2015 г. 7:39, спустя 11 минут 23 секунды

    Я бы сразу сделал explode по разделителю и анализировал уже массив.
    Опиши задачу подробнее, с примером.

    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 7:52, спустя 13 минут 4 секунды

    тоже не совсем понял задачу.

    дай входящие примеры роутов и что есть. но полагаю что задача просто регуляркой не решится. регулярка не хранит стек и не имеет строгой очередности совпадений.

    Сапожник без сапог
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 9:20, спустя 1 час 28 минут 24 секунды

    Ладно, забейте я уже почти сделал, типа такого надо:
    (id0|id1|id2|id3)(_(id0|id1|id2|id3))+
    Пока только проблема в том, что можно много раз один и тот же идентификатор включить в строку, чего в идеале не должно было бы быть. Но для начала, сойдет.

    Пример роута типа

    http://сайт/news_photos_videos
    или
    http://сайт/videos_photos

    Мастер, explode понятное дело будет, но надо сначала выловить подходящие урлы

  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 15 апреля 2015 г. 9:24, спустя 3 минуты 52 секунды

    @AlexB, я бы сперва прогнал бенчмарком оба случая. как бы не оказалось, что регулярка на порядок медленнее эксплода =)

    Спустя 134 сек.

    http://сайт/news_photos_videos

    это вместо http://сайт/news/photos/videos ?

    не всё полезно, что в swap полезло
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 9:28, спустя 3 минуты 49 секунд

    Дык, для того чтобы прогонять эксплодом, надо сначала найти то, что через него прогонять. )))))

  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 15 апреля 2015 г. 9:29, спустя 1 минуту 28 секунд

    @AlexB, не нужно искать, т.к. на один запрос всегда один request url

    какой логический смысл в такой форме news_photos_videos ?

    не всё полезно, что в swap полезло
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 9:32, спустя 2 минуты 23 секунды

    это вместо http://сайт/news/photos/videos ?

    @master, ну как бы не совсем, представь что реальный случай несколько сложнеее

    http://сайт/typelist/photos_videos_news/date/2015-01-01/

    Как-то нехорошо типы слешами бить, еще сильнее роутинг запутается

    Спустя 83 сек.

    @master, ты в курсе как устроен роутинг в любом фреймворке, в Джанге той же?

    Спустя 68 сек.

    какой логический смысл в такой форме news_photos_videos ?

    перечислить типы объектов, которые надо показать

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 9:39, спустя 7 минут 21 секунду

    @AlexB, какие то костыли делаешь имхо ))

    и таки да, порядок в регулярке не укажешь - я тебе еще выше ответил

    Сапожник без сапог
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 9:41, спустя 1 минуту 30 секунд

    @phpdude, Предложи по другому?

    Разве что через GET ?types=videos,photos
    Но по ряду причин не охота так делать

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 9:44, спустя 3 минуты 25 секунд

    @phpdude, Предложи по другому?

    Разве что через GET ?types=videos,photos
    Но по ряду причин не охота так делать

    @AlexB, вот этот вариант мне больше симпатизирует. Ибо он более естественный, раз это фильтрация выдачи. Url path это все-таки расопложение документа, вы его както извратили короче)

    Сапожник без сапог
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 15 апреля 2015 г. 9:46, спустя 2 минуты 7 секунд

    @AlexB, да, урл бьётся на переменным с определённым смыслом. во всех фреймворках по-разному

    в данном случае походу

    http://сайт/typelist/photos_videos/date/2015-01-01/ => {typelist: 'photos_videos', date: '2015-01-01'}

    я лично не очень люблю такой формат потому что

    • урлы получаются длиннее в 2 раза

    • наименования параметров просто не нужны, т.к. их можно задать позиционно

    • имена параметров в урлах выступают как ключи в SEO, что не всегда желательно

    • дополнительный вектор атаки через перебор возможных имён переменных

    причём в урлах переменные обычно имеют такой смысл

    http://site/[controller]/[method]/[id]

    в общем, суть в том, что первые сегменты указывают на метод, остальные сегменты означают какие-то данные. это значит, что обработка происходит в таком порядке:

    1. урл сперва матчится по роутам,

    2. бьётся на параметры

    3. эти параметры передаются в метод

    4. уже в этом методе обрабатываются, если нужно - проходят дополнительную проверку.

    ты же пытаешься обработать их в другом порядке:

    1. матчить урл по роутам И одновременно выполнить проверку

    2. разбить по параметрам

    3. передать в метод

    а поскольку роуты в жанге построены на регулярках, то и решение п.1. ты ищешь целиком на регулярке

    не всё полезно, что в swap полезло
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 15 апреля 2015 г. 10:05, спустя 18 минут 42 секунды

    если формат урла изменять не хочется, то я бы сделал просто

    ^typelist/(?P<types>[^/])/date/(?P<date>\d{4}-\d{2}-\d{2})$

    и уже в методе сделал бы эксплод и проверку

    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 10:08, спустя 3 минуты 3 секунды

    @master, неплохая идея. я бы сделал примерно так же. если бы не реформировал юрл

    Сапожник без сапог
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 апреля 2015 г. 10:12, спустя 4 минуты 10 секунд

    Фигня в том, что вот так
    (?P<types>[^/])
    я ловить не могу т.к. если тип один /photos/ нужен вызов одного метода, а если тип множественный /photos_videos/ нужно вызывать другой, который присобачит небольшую оберточку

Пожалуйста, авторизуйтесь, чтобы написать комментарий!