Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задачка с регуляркой

369
24 октября 2011 года
Kesano
451 / / 09.10.2007
Появилась зачадчка разобрать URI регуляркой:
Цитата:
/one/two/three?guuu=http://one.ru/two/ororo


Задача, вынуть one, two, three и отбросить ?guuu=http://one.ru/two/ororo (или #some_anchor)
сделать это нужно одной регуляркой.
Решение такого вида:

 
Код:
$uri='/one/two/three?guuu=http://one.ru/two/ororo';
$uri=strtok('?',$uri);
preg_match_all('#\w+#', $uri, $aliases, PREG_SET_ORDER);

не устраивает, т.к. для отсекания того что после "?" используется strtok, а нужно регуляркой.
Пробовал с просмотром назад\вперед, типа
 
Код:
(?<!\?.*)(\w+)
но конструктор такое обрабатывать не захотел... Руководствовался логикой если перед совпадением (последовательность символов составляющих слово) не стоит символ ? и, возможно, любые символы после него
366
24 октября 2011 года
int
668 / / 30.03.2005
#^/(\w+)/(\w+)/(\w+)\?#
369
24 октября 2011 года
Kesano
451 / / 09.10.2007
Цитата: int
#^/(\w+)/(\w+)/(\w+)\?#



трабл в том, что может быть
/one/two?guuu=http://one.ru/two/ororo
т.е. количество вхождений чётко не задано...
Но ты натолкнул меня на мысль... Например, если заведомо известно что коль-во вхождений ограничено 5... тогда проканает такая тема:
#^\/?(\w+)?\/?(\w+)?\/?(\w+)?\/?(\w+)?\/?(\w+)?\??\#?#
Быть может можно как-то сократить эту конфигурацию???
Спс...

14
24 октября 2011 года
Phodopus
3.3K / / 19.06.2008
 
Код:
$uri='/one/two/three/seven/eight/nine/ten?guuu=http://four.ru/five/six';
    $pattern = '#((/[^?/]+){1,}?|\?.*)#';
    preg_match_all($pattern, $uri, $matches);  #
    print_r($matches);

хотя это извращение и strtok просто великолепен. а точнее даже substr и strpos
366
25 октября 2011 года
int
668 / / 30.03.2005
Ну значит нужно ставить вопросительные знаки в тех местах, которых может не быть.
369
25 октября 2011 года
Kesano
451 / / 09.10.2007
Цитата: Phodopus
 
Код:
$uri='/one/two/three/seven/eight/nine/ten?guuu=http://four.ru/five/six';
    $pattern = '#((/[^?/]+){1,}?|\?.*)#';
    preg_match_all($pattern, $uri, $matches);  #
    print_r($matches);

хотя это извращение и strtok просто великолепен. а точнее даже substr и strpos


Спасибо, я знаю что извращение.. Задача чисто исследовательская...
Я слегка модифицировал:

 
Код:
$uri='/one/two/three/seven/eight/nine/ten?guuu=http://four.ru/five/six';
$pattern = '#(\w+)|\?.*#';
preg_match_all($pattern, $uri, $matches);
echo '<pre>'.print_r($matches, true).'</pre>';

И matches[1] вполне можно использовать для работы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог