Помогимте оптимизировать функции (preg_replace_callback)...

avenger_msoft

Новичок
Помогимте оптимизировать функции (preg_replace_callback)...

Привет Всем!

Мне необходимо привести все URL на сайте типа:
http://avenger/index.php?module=news
http://avenger/index.php?module=projects&action=show
http://avenger/index.php?module=projects&action=show&pid=1&id=236&page=1
к виду:
http://avenger/news/index.html
http://avenger/projects/show/index.html
http://avenger/projects/show/1/236/index.html?page=1

Общий вид преобразования можно задать так:
http://avenger/$module/$action/$pid/$id/index.html?#ОСТАЛЬНЫЕ ПАРАМЕТРЫ#

Я написал соответствующие функции:
PHP:
function __callback_Rebuild_URL($__matches) {
	$__vars		= array();
	$__result	= preg_replace('@(\w+)=(\w+)@e', '$__vars["\\1"] = "\\2";', $__matches[2]);
	$__keys		= array('module', 'action', 'pid', 'id');

	$URL_Path	= "";
	reset($__keys);
	while (count($__vars) && list(, $key_id) = each($__keys)) {
		if (!isset($__vars[$key_id]))
			break;
		$URL_Path .= "/" . $__vars[$key_id];
		unset($__vars[$key_id]);
	}

	$URL_Parameters	= "";
	reset($__vars);
	foreach ($__vars as $name => $value) {
		$URL_Parameters .= $name . "=" . $value . "&";
	}
	$URL_Parameters	= preg_match("#&$#", $URL_Parameters) ? 
           substr($URL_Parameters, 0, -1) : $URL_Parameters;
    if (count($__vars))
    	$URL_Parameters = "?" . $URL_Parameters;

	return $__matches[1] . $URL_Path . "/index.html" . $URL_Parameters . $__matches[1];
}


function smarty_outputfilter_Communicator_Rewrite_URL($source, &$smarty) {
	$source = preg_replace("@&(amp|#38);@i", "&", $source);
	$source = preg_replace_callback(
			"# (['\"]{1}) " . "index\.php" . "(?:\?) ([^<>]*) ?\\1{1}? #ixU",
		"__callback_Rebuild_URL", $source);

	return $source;
}
Надо оптимизоровать функцию __callback_Rebuild_URL, и по возможности регулярное выражение "# (['\"]{1}) " . "index\.php" . "(?:\?) ([^<>]*) ?\\1{1}? #ixU"

С уважением, Иван.
 

avenger_msoft

Новичок
2Фанат
Долго отрабатывается. А урл у меня много. Вот и встал вопрос оптимизации участков. Может можно как-то проще?
 

Фанат

oncle terrible
Команда форума
Адреса на сайте надо заменить один раз.
а не делать это при каждом выводе каждой страницы.
 

avenger_msoft

Новичок
2Фанат Я бы с удовольствием, но проект уже вырос до очень больших размеров.
 

Фанат

oncle terrible
Команда форума
логика на грани фантастики.
ну, не буду мешать. оптимизируй, оптимизатор...
 

avenger_msoft

Новичок
А можно как нибудь задать в подмножестве захваченную подмаску, например как нибудь так:
PHP:
"# (['\"]{1}) ([^<>\\1]*)#ixU"
?
Интересует именно [^<>\\1], где \\1 - захваченная первая подмаска?

-~{}~ 22.12.06 09:20:

Может, кому понадобится:
Решение
PHP:
$source = preg_replace_callback(
    "# (['\"]{1}) " . "index\.php" . "(?:\?) ( (?:(?!(<|>|\\1)).)* ) ?\\1{1}? #ixU",
  "__callback_URL_Rebuild", $source);
-~{}~ 22.12.06 09:22:

А можно как нибудь задать в подмножестве захваченную подмаску, например как нибудь так:
PHP:
"# (['\"]{1}) ([^<>\\1]*)#ixU"
?
Интересует именно [^<>\\1], где \\1 - захваченная первая подмаска?

Может, кому понадобится:
Решение:
PHP:
$source = preg_replace_callback(
    "# (['\"]{1}) " . "index\.php" . "(?:\?) ( (?:(?!(<|>|\\1)).)* ) ?\\1{1}? #ixU",
  "__callback_URL_Rebuild", $source);
-~{}~ 22.12.06 09:24:

2Модератор: Жопа на форуме происходит, не могу отредактировать сообщение. Надо отключить смайлы в этом сообщении.
 
Сверху