Настраиваемые ЧПУ

eXtractor

Новичок
Настраиваемые ЧПУ

Думаю, как реализовать сабж. Нужно почти как в Вордпрессе.

Предположим (!), я пишу блог-движок. Там будут настраиваемые URL для просмотра новостей по тегам и по дате, скажем, в таком формате:
PHP:
$url_format_tag = 'tags/%t/';
$url_format_date = 'archive/%y/%m/';
(%t — тег, %y — год, а %m — месяц)

Пользователь заходит по адресам вроде http://example.com/tags/php/ или http://example.com/archive/2007/04/ (кусок адреса передается при помощи mod_rewrite в переменную $p), скрипт определяет что же он хочет и выдает результат.

Что-то подобное делает Wordpress (там пермалинки с настраиваемыми адресами).

Полагаю, это как-то реализуемо при помощи форматированных строк.

PS. Извините, если было. Честно обшарил весь форум — ничего не нашёл.
 

eXtractor

Новичок
Нет, не отменили.
Он у меня превращает http://example.com/blablabla/ в http://example.com/?p=blablabla/

А вот что дальше…
 

eXtractor

Новичок
Наверное, я плохо объяснил.

Нужно этот самый $p = $_GET['p'] проверить на соответствие шаблонам, и выполнить то или иное действие, в зависимости от того, чему ($url_format_tag или $url_format_date) оно соответствует.

http://example.com/tags/php/ → похоже на $url_format_tag → показываем все записи с тегом php
http://example.com/archive/2007/04/ → похоже на $url_format_date → показываем все записи за апрель 2007го.
 

Апокалипсис

тех дир matras.ru
в чём проблема не пойму?
посмотри как устроено ЧПУ в том же вордпрессе
там не слижком уж сложный код
 

eXtractor

Новичок
В общем плюнул, решил написать своё 8) Получилось вот что:
PHP:
<?php

$p = $_GET['p'];
$t = 'arc/{$year}/{$month}';

function parse_urltpl($template,$path) {
	$reg = preg_replace('/\{\$([a-z]+)\}/','(.+)', $template);
	$reg = '/^'.str_replace('/','\/',$reg).'$/';

	$match = preg_match($reg,$path,$var_values);

	if ($match) {
		//Ошибка где-то тут
		preg_match('/(?:\{\$){1}([a-z]+)(?:\}){1}/',$template,$var_names);
		unset($var_names[0]);
		unset($var_values[0]);
		return array_combine($var_names,$var_values);
	}
	else return false;
}

$r = parse_urltpl($t, $p);
print_r($r);

?>
(Запускаем ?p=arc/2007/04)

Одна проблема: в массив $var_names заносится имя только первой переменной (year). В регулярных выражениях вообще не рублю.

-~{}~ 11.11.07 21:46:

PHP:
preg_match('/(?:\{\$){1}([a-z]+)(?:\}){1}/',$template,$var_names);
После этой строчки почему-то получается, что массив $var_names
Код:
Array ( [0] => {$year} [1] => year )
а должен
Код:
Array ( [0] => $template [1] => year [2] => month )
 

eXtractor

Новичок
Автор оригинала: triumvirat
это профанация ЧПУ
Это маленький тестовый скрипт.

-~{}~ 11.11.07 23:51:

Автор оригинала: Апокалипсис
Не пойму что мешает сделать простое [m]explode[/m] если не силён в регулярках ;)
Чувство прекрасного :) Делал я так, но внутрь explode запихивал preg_replace.

Кстати, а не поможет ли тут preg_match_all?

-~{}~ 12.11.07 00:05:

Всё, починил. Тему можно закрыть.

-~{}~ 12.11.07 00:15:

Всем спасибо за участие :)
 

GrayHound

Новичок
чото капец... а тупо парсить послед разделения "/" нет? :) заодно привязки можно жёсткие сделать, чуть где не так юзер ввёл - шлём его куда подальше... всмысле 404
 
Сверху