Нужна помощь в изменении этих простых регулярных выражений для соответствия URL - PullRequest
1 голос
/ 19 января 2011

Я строю объект маршрутизатора в небольшой среде MVC.Он анализирует строки URL-адресов для обнаружения контроллеров, действий и т. Д. Он настраивается.

В настоящее время пользователь может создавать маршруты, передавая строки, подобные следующим:

$this->connect('/:controller/:action/*');
$this->connect('/:controller', array('action' => 'index'));
$this->connect('/', array('controller' => 'static_pages', 'action' => 'index'));

И маршрутизатор создаетследующие регулярные выражения из них:

#^(.*)/(.*)/?.*/?$#
#^(.*)/?$#
#^/$#

Наконец, маршрутизатор пытается выбрать правильный маршрут на основе URL.URL-адреса для указанных выше маршрутов будут выглядеть примерно так:

/cars/get_colors/  # will invoke cars->get_colors();
/cars/             # will invoke cars->index();
/                  # will invoke static_pages->index();

Однако

Мои регулярные выражения неверны.Первое (более конкретное) выражение может соответствовать второму условию, а второе - первому.

Если я переверну порядок для проверки в обратном порядке, маршрут статических страниц будет работать, тогда будет работать индексный маршрут контроллера, но индексная маршрутизация контроллера перехватывает все более конкретные из них!

Обновление

Я использую регулярные выражения, потому что пользователь также может подключать маршруты, подобные этим:

$this->connect('/car/:action/*', array('controller' => 'cars');
$this->connect('/crazy/url/:controller/:action/*');

Который построит два регулярных выражения, подобных этому:

#^car/(.*)/?.*/?$#
#^crazy/url/(.*)/(.*)/?.*?$#

Наконец, выполните следующую маршрутизацию:

/car/get_colors/             # will invoke cars->get_colors();
/crazy/url/cars/get_colors/  # will invoke cars->get_colors();

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Прежде всего, вы могли бы упростить свою жизнь, используя функцию разнесения, чтобы разбить URL на слагы, и вообще не использовать регулярные выражения.

Однако, если вы должны использовать регулярные выражения, замените «. *» На «[^ /] +»

Помните, точка соответствует всему, включая косую черту. Выражение «[^ /]» соответствует всему, кроме косой черты.

Кроме того, вам нужно начинать регулярное выражение с косой черты, если строка будет начинаться с косой черты.

Наконец, вам нужно использовать квантификатор "+" вместо квантификатора "*".

Рассмотрим следующие примеры, которые соответствуют регулярным выражениям в вашем посте:

#^/[^/]+/[^/]+(/.*)?$#
#^/[^/]+/?$#
#^/$#
#^/car/[^/]+(/.*)?$#
#^/crazy/url/[^/]+/[^/]+(/.*)?$#
1 голос
/ 02 августа 2011

Я использовал для этого функцию preg_replace.

preg_replace ($ pattern, $ replace, $ string)

Функция preg_replace выполняет поиск и замену регулярного выражения. Это будет искать предмет соответствия для шаблона и заменяет их заменой.

например. http://example.com/my-planet-earth/

Я говорю о форматировании «моя планета Земля». Здесь $ string может быть 'My Planet Earth', а $ urlKey будет 'my-planet-earth' $ string = "planet + * & john doe / / \ \ ^ 44 5% 6 + - @ ku! ~` This " ; $ urlKey = preg_replace (массив ('/ [^ a-z0-9 -] / i', '/ [] {2,} /', '/ [] /'), массив ('', '', ' - '), $ string); // выводит: planet-john-doe-44-5-6 --- ku-this

Надеюсь, это поможет.

...