"Обратные" регулярки

BubenPupen

Новичок
"Обратные" регулярки

Есть таблица pages:
id, regexp

В ней есть строки:
1, /news/[0-9]+/$
2, /news/[0-9]+/[0-9]+/[0-9]+/$

Есть переменная:
$url = '/news/123/';

Как мне выбрать строку, регекспу в которой соответствует переменная (тут это будет первая строка)?
 

Фанат

oncle terrible
Команда форума
ты хорошо подумал перед тем, как хранить в базе паттерны регулярных выражений?
 

BubenPupen

Новичок
Фанат
Хм, ну собственно у тебя есть другие варианты ?
Для чего мне это нужно:
Я хочу сделать возможность "создавать" страницы и назначать на них действия. Вот создаю я страницу /news/[news_id]/, и назначаю на нее действие "Показать новость по её id".
Можно создать страницу /news/[year]/[month]/[day]/ и назначить действие "Показать список новостей за дату".
Через mod_rewrite все запросы перенаправляются на index.php, он должен по урл выбрать из базы id страницы и по ней узнать какие модули и действия запускать.
Вот заходит пользователь на /news/123/, движок должен выбрать запись из таблицы pages с id = 1 (в данном случае).
Потом по этому id из другой таблицы выбираются модули (тут это модуль "Новости"), которые будут использованы на странице, и запускаются действия ("Показать новость по её id", итд).
 

BubenPupen

Новичок
Фанат
Все эти [year], [month], [day], [news_id] описаны в настройках модуля. Все они будут [0-9]+, то есть регэксп будет
/news/[0-9]+/[0-9]+/[0-9]+/$
 

Фанат

oncle terrible
Команда форума
Очень интересно. вот получил ты id из базы. и что будешь дальше с ним делать?
 

BubenPupen

Новичок
Фанат
Есть еще 2 таблицы
`page_actions`:
id, page_id, module_action_id

`module_actions`:
id, module_id, action

Таким запросом получаем все модули и действия, которые должны выполнится на данной странице:
[sql]
SELECT MA.id, MA.module_id, MA.action, A.page_id, A.module_action_id, P.url, M.name as module FROM `pages` P,`page_actions` A, `module_actions` MA, `modules` M WHERE P.url='{$this->url}' AND A.page_id=P.id AND MA.id = A.module_action_id AND M.id=MA.module_id
[/sql]

Тут надо сказать (я раньше не написал) что вообще-то в таблице `pages` есть еще третий столбец - `url`. Если страница статичная (/news/, то есть без "переменных"), то все работает. А третий столбец `regexp` я добавил, думая что можно как-то с помощью Mysql это все будет провернуть в одном запросе (чтобы не проводить преобразований - [news_id] в [0-9]+ итд).

После этого:
PHP:
	foreach($this->modules as $module)
	{
	include_once('./classes/class.'.$module.'.php');
	$m = new $module;
	$m->loadActions($this->actions[$module]);
	}
 

BubenPupen

Новичок
По делу есть что сказать ?

Впринципе, можно просто тупым перебором это все сделать, но неужели нету другого варианта ?
 

Фанат

oncle terrible
Команда форума
ты первый, кто придумал хранитьв базе данных не только названия модулей, но и действия, которые надо предпринять. которые идентифицировать регулярными выражениями.
Остальные люди не достигли такого просветления, и обработку действий пишут пошло, в скриптах.

Как и всякому гению-первопроходцу, тебе придётся столкнуться с трудностями, которые надо решить самому. Ведь до тебя так никто не делал. Зато тебе достанется честь и слава.
 

BubenPupen

Новичок
Всё оказалось просто:
[sql]
SELECT * FROM pages WHERE '/news/123/' REGEXP `regexp`
[/sql]

Спасибо xpoint.ru :)
 
Сверху