Не работает preg_replace

123
R
На сайте с 20.02.2015
Offline
59
#11

v_ovan, щас глянул, у него шаблонизатор smarty. А у него нет встроенной функции preg_replace и поэтому нужен блок {php}..{/php}


{foreach from=$paginator->getPageList() item=page}
{php}$page_href=preg_replace('/\[\d+?\]/i', '[]', $page.href);{/php}
<a href="{$page_href}" {if $page.act}class="act"{/if}>{if $page.class=='left'}&laquo;{$page.n}{elseif $page.class=='right'}{$page.n}&raquo;{else}{$page.n}{/if}</a>
{/foreach}
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#12

Нафиг использовать шаблонизатор, если в него опять пихать ПХП код?!

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
v_ovan
На сайте с 14.05.2008
Offline
165
#13

на тег {php} ругается матом, а вот так - нормально

<?php

$page_href=preg_replace('/\[\d+?\]/i', '[]', $page.href);

?>

адрес получился с [] наконец-то,

но ссылка не такая, как должна быть (там пагинация).

должно быть bfilter[brand][]=13&bfilter[brand][]=24&p=2

а получается bfilter[brand][]=13&bfilter[brand][]=24

что-то нужно видимо, с другими переменными типа $page.n сделать

---------- Добавлено 21.10.2016 в 00:21 ----------

а если делаю

{foreach from=$paginator->getPageList() item=page}     

<?php
$page.href=preg_replace('/\[\d+?\]/i', '[]', $page.href);
?>
<a href="{$page.href}" {if $page.act}class="act"{/if}>{if $page.class=='left'}&laquo;{$page.n}{elseif $page.class=='right'}{$page.n}&raquo;{else}{$page.n}{/if}</a>
{/foreach}

то урл получается bfilter[brand][0]=13&bfilter[brand][1]=24&p=2

т.е. номер страницы есть, но опять [0]

Горящие туры (https://teplo.ru/)
R
На сайте с 20.02.2015
Offline
59
#14
v_ovan:
на тег {php} ругается матом

А не должен http://www.smarty.net/best_practices он есть в документации. Платный продукт а использует либу по GPL лицензии(хоть не запрещено).. как то не комильфо

Замените на это, другой pattern


$page.href = preg_replace("#]\[\d+]#", "][]", $page.href);
v_ovan
На сайте с 14.05.2008
Offline
165
#15
rereg:
А не должен http://www.smarty.net/best_practices он есть в документации.

там ниже написано вроде как надо:

Here is what our plugin file will look like:

<?php
/*
* Smarty plugin
* -------------------------------------------------------------

а {php} красным выделено - нельзя.

R
На сайте с 20.02.2015
Offline
59
#16

{php} блок он есть http://www.smarty.net/docsv2/ru/language.function.php.tpl просто у вас он скорее всего ругается на переменные smarty внутри этого блока.

Такая там встроенная штука есть http://www.smarty.net/docsv2/ru/language.modifier.regex.replace.tpl


{foreach from=$paginator->getPageList() item=page}
<a href="{$page.href|regex_replace:"#]\[\d+]#":"][]"}" {if $page.act}class="act"{/if}>{if $page.class=='left'}&laquo;{$page.n}{elseif $page.class=='right'}{$page.n}&raquo;{else}{$page.n}{/if}</a>
{/foreach}
S
На сайте с 30.09.2016
Offline
469
#17

Насчёт регулярки - я выше написал уже реально работающий код. Насчёт включения пхп в смарти и наоборот: пхп не воспринимает переменных смарти, а смарти плевать хотел на теги <?php ?> - отсюда и косяки. Вариант - зарегистрировать функцию смарти вне шаблона, а потом уже использовать её в шаблоне с аргументом $page.href.

В Смарти вместо preg_replace применяется regex_replace. Синтаксис:

{$page.href|regex_replace:"/шаблон /":"замена"}
Как в примере у rereg.
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
v_ovan
На сайте с 14.05.2008
Offline
165
#18
rereg:
{php} блок он есть http://www.smarty.net/docsv2/ru/language.function.php.tpl просто у вас он скорее всего ругается на переменные smarty внутри этого блока.
Такая там встроенная штука есть http://www.smarty.net/docsv2/ru/language.modifier.regex.replace.tpl

{foreach from=$paginator->getPageList() item=page}
<a href="{$page.href|regex_replace:"#]\[\d+]#":"][]"}" {if $page.act}class="act"{/if}>{if $page.class=='left'}&laquo;{$page.n}{elseif $page.class=='right'}{$page.n}&raquo;{else}{$page.n}{/if}</a>
{/foreach}

не хочет она у меня работать :(

---------- Добавлено 21.10.2016 в 01:39 ----------

Sitealert:
Вариант - зарегистрировать функцию смарти вне шаблона, а потом уже использовать её в шаблоне с аргументом $page.href.

Сегодня я уж это точно не осилю.

Спасибо всем за помощь!

S
На сайте с 30.09.2016
Offline
469
#19
v_ovan:
Сегодня я уж это точно не осилю.

И не надо - это в общем случае, а здесь и regex_replace сработает. То, что предложил rereg, должно работать, наверное, какой-то нюансик не учтён, типа замены двойных кавычек на одинарные. На свежую голову наверняка увидите :).

v_ovan
На сайте с 14.05.2008
Offline
165
#20

Сегодня получил ответ на форуме ReadyScript. На всякий случай сюда продублирую, вдруг кому понадобится.

Всё просто на хостинге у Вас не работает, потому, что если посмотреть в исходный код страницы, то вы увидите следующее.

/catalog/elektronika/?bfilter%5Bbrand%5D%5B0%5D=3&bfilter%5Bbrand%5D%5B1%5D=5&bfilter%5Bbrand%5D%5B2%5D=1&bfilter%5Bbrand%5D%5B3%5D=2&bfilter%5Bbrand%5D%5B4%5D=4&bfilter%5Bbrand%5D%5B5%5D=6&bfilter%5Bbrand%5D%5B6%5D=7&bfilter%5Bbrand%5D%5B7%5D=8&bfilter%5Bbrand%5D%5B8%5D=9&bfilter%5Bbrand%5D%5B9%5D=10&bfilter%5Bbrand%5D%5B10%5D=11&bfilter%5Bbrand%5D%5B11%5D=12&p=2

Т.е. [ это %5B ] это %5D, потому, что это правильная кодировка адресов через urlencode. Соответственно правильно будет так:

{$page_href=preg_replace('/\[\d+?\]/i', '[]', urldecode($page.href))}

Т.е. мы предварительно раскодировали для преобразования.

P.S. Мы всегда поддерживаем только одни из самых последних технологий.


http://forum.readyscript.ru/post/5111/#p5111

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий