Прошу! помогите с редиректом (горю)

PHP:
$url = preg_replace_callback('~brand=\d+(_\d+)+~', function($m) {return str_replace('_', '%2C', $m[0]);}, $_SERVER['REQUEST_URI']);
if ($url != $_SERVER['REQUEST_URI']) {
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://".$_SERVER['HTTP_HOST'].$url);
  exit();
}

А средствами mod_rewrite это можно провернуть примерно так
Код:
RewriteCond %{QUERY_STRING}  (brand=\d++)_(\d++)_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?\K.*
RewriteCond %1\%2C%2\%2C%3\%2C%4\%2C%5\%2C%6\%2C%7\%2C%8\%2C%9\%2C%0  (brand=(?:(?:%2C)?\d+)+)(?:\%2C)*+(.*)
RewriteRule ^.*$ /$0?%1%2 [R=301,L,NE]
Супер! Только не доглядел одного момента
medtehnika/tonometry.html?brand=210_87_91&tovar_tonometr_dopolnitelno=313_312&tovar_tonometr_manjeta=308_306
в общем все что между цифрами надо поменять на %2C
мож лучше привязать к условию с символом =
буду очень признателен
 
Супер! Только не доглядел одного момента
medtehnika/tonometry.html?brand=210_87_91&tovar_tonometr_dopolnitelno=313_312&tovar_tonometr_manjeta=308_306
в общем все что между цифрами надо поменять на %2C
мож лучше привязать к условию с символом =
буду очень признателен
название параметров не известно т.е. я о
brand=
tovar_tonometr_dopolnitelno=
tovar_tonometr_manjeta=
......
 
Просто убрать brand из шаблона
PHP:
$url = preg_replace_callback('~=\d+(_\d+)+~', function($m) {return str_replace('_', '%2C', $m[0]);}, $_SERVER['REQUEST_URI']);
if ($url != $_SERVER['REQUEST_URI']) {
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://".$_SERVER['HTTP_HOST'].$url);
  exit();
}
 
А средствами mod_rewrite это можно провернуть примерно так
Код:
RewriteCond %{QUERY_STRING}  (brand=\d++)_(\d++)_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?(\d++)?_?\K.*
RewriteCond %1\%2C%2\%2C%3\%2C%4\%2C%5\%2C%6\%2C%7\%2C%8\%2C%9\%2C%0  (brand=(?:(?:%2C)?\d+)+)(?:\%2C)*+(.*)
RewriteRule ^.*$ /$0?%1%2 [R=301,L,NE]
И снова чудесные извращения в htaccess :)
Уважаемый lag подскажите пожалуйста, что делает второй + в части \d++ ?
 
Кроме ленивых и жадных есть супер жадные квантификаторы ++ *+ ?+ которые не откатываются назад.
\d++ эквивалент (?>\d+)
Вообще тут можно спокойно заменить (\d++)? на (\d*) и для наглядности заменить %2С на запятую.
Код:
RewriteCond %{QUERY_STRING}  (brand=\d+)_(\d+)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?\K.*
RewriteCond %1,%2,%3,%4,%5,%6,%7,%8,%9,%0  (brand=(?:,?\d+)+),*(.*)
RewriteRule ^.*$ /$0?%1%2 [R=301,L,NE]

Первой регуляркой сохраняем найденные номера в переменные %1-%9. Потом объединяем их через запятую.
Для просмотра ссылки Войди или Зарегистрируйся

Остаётся убрать хвост с лишними запятыми и готово.
Для просмотра ссылки Войди или Зарегистрируйся
 
Кроме ленивых и жадных есть супер жадные квантификаторы ++ *+ ?+ которые не откатываются назад.
\d++ эквивалент (?>\d+)
Вообще тут можно спокойно заменить (\d++)? на (\d*) и для наглядности заменить %2С на запятую.
Код:
RewriteCond %{QUERY_STRING}  (brand=\d+)_(\d+)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?(\d*)_?\K.*
RewriteCond %1,%2,%3,%4,%5,%6,%7,%8,%9,%0  (brand=(?:,?\d+)+),*(.*)
RewriteRule ^.*$ /$0?%1%2 [R=301,L,NE]

Первой регуляркой сохраняем найденные номера в переменные %1-%9. Потом объединяем их через запятую.
Для просмотра ссылки Войди или Зарегистрируйся

Остаётся убрать хвост с лишними запятыми и готово.
Для просмотра ссылки Войди или Зарегистрируйся
Как? Ну вот каааак Вы пишете такие регулярки? Сэнсей, где научится Вашему кунг-фу?
 
Ну вот на этом примере тут всё просто.
Сначала собираем нужное. Потом на следующей строке собираем отсекаем лишнее и собираем готовый результат.
 
Пипец. А сложные примеры как собираешь? Это всё из головы берется, или на сервисе методом подбора регулярка составляется?
И да, что означает ?: Гугл не хочет спецсимволы гуглить...
 
Ну так сложную задачу разбиваю на ряд более простых декомпозиция же :)
( ) сохраняющая группа
(?: ) несохраняющая группа

Собственно подбирается тестируется всё на regex101.com
 
Назад
Сверху