Задачка с регуляркой
Цитата:
/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);
$uri=strtok('?',$uri);
preg_match_all('#\w+#', $uri, $aliases, PREG_SET_ORDER);
не устраивает, т.к. для отсекания того что после "?" используется strtok, а нужно регуляркой.
Пробовал с просмотром назад\вперед, типа
Код:
(?<!\?.*)(\w+)
#^/(\w+)/(\w+)/(\w+)\?#
Цитата: int
#^/(\w+)/(\w+)/(\w+)\?#
трабл в том, что может быть
/one/two?guuu=http://one.ru/two/ororo
т.е. количество вхождений чётко не задано...
Но ты натолкнул меня на мысль... Например, если заведомо известно что коль-во вхождений ограничено 5... тогда проканает такая тема:
#^\/?(\w+)?\/?(\w+)?\/?(\w+)?\/?(\w+)?\/?(\w+)?\??\#?#
Быть может можно как-то сократить эту конфигурацию???
Спс...
Код:
$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);
$pattern = '#((/[^?/]+){1,}?|\?.*)#';
preg_match_all($pattern, $uri, $matches); #
print_r($matches);
хотя это извращение и strtok просто великолепен. а точнее даже substr и strpos
Ну значит нужно ставить вопросительные знаки в тех местах, которых может не быть.
Цитата: 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);
$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>';
$pattern = '#(\w+)|\?.*#';
preg_match_all($pattern, $uri, $matches);
echo '<pre>'.print_r($matches, true).'</pre>';
И matches[1] вполне можно использовать для работы.