[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Замена %knopka% на код
denlam
Из базы вытаскивается большой кусок текста. Заносим в переменную $text.
В $text в некоторых местах содержится %%knopka%% . Везде, где содержится %%knopka%% его нужно заменить на определенный кусок html кода, например
"<div class='serious_button></div>'".
Собственно Вопрос: Как реализовать замену?



Спустя 5 минут, 1 секунда (8.09.2012 - 23:29) rooor написал(а):
str_replace()

Спустя 40 минут, 4 секунды (9.09.2012 - 00:09) killer8080 написал(а):
Цитата (rooor @ 8.09.2012 - 23:29)
str_replace()

Нет, лучше strtr.

Спустя 15 часов, 55 минут, 53 секунды (9.09.2012 - 16:04) FatCat написал(а):
Цитата (killer8080 @ 9.09.2012 - 01:09)
лучше strtr

Меньше ресурсов кушает?

Спустя 4 часа, 17 минут, 36 секунд (9.09.2012 - 20:22) killer8080 написал(а):
Цитата (FatCat @ 9.09.2012 - 16:04)
Меньше ресурсов кушает?

Нет, не в этом дело, у str_replace есть свои подводные камни, когда в реплейс передается массив, она может перезаписать вставленный её же текст, если в нем окажутся совпадения со следующими элементами массива замены. Это может привести к непредсказуемому результату. В данном случае, если нужно заменить только одну подстроку, проблем не будет, но обычно в шаблонах делают замену пачкой, вот тут то можно наступить на грабли.

Спустя 2 минуты, 9 секунд (9.09.2012 - 20:24) Игорь_Vasinsky написал(а):
т.е. ты говоришь о том что в strtr() - чёткая замена (2й аргумент) ключ -> элемент ?

Спустя 31 минута, 42 секунды (9.09.2012 - 20:56) killer8080 написал(а):
Цитата (Игорь_Vasinsky @ 9.09.2012 - 20:24)
т.е. ты говоришь о том что в strtr() - чёткая замена (2й аргумент) ключ -> элемент ?

Именно так, дабы не быть голословным, накидал тестовый пример
$tpl = '%Header% %Nav%'; 

$replace = array(
'%Nav%' => '<ul> <li>Navigation</li> <li>some %Header%</li> </ul>',
'%Header%' => '<h1>Header text</h1>'
);
echo strtr($tpl, $replace);
echo '<hr />';
echo str_replace(array_keys($replace), $replace, $tpl);


strtr в начале ищет в тексте все позиции искомых подстрок, а только потом делает замену, в отличии от str_replace, которая последовательно заменяет подстроку за подстрокой, при этом поиск происходит по уже измененному тексту на предыдущей итерации.

Спустя 48 минут, 14 секунд (9.09.2012 - 21:44) rooor написал(а):
проще говоря strtr идёт от начала до конца, а str_replace при каждой замене начинает искать с начала... unsure.gif

Спустя 29 минут, 32 секунды (9.09.2012 - 22:14) Игорь_Vasinsky написал(а):
ну, я кабы не сомневался biggrin.gif просто решил озвучить вслух. сам уже давно отказался от str_replace()

Спустя 5 часов, 33 минуты, 46 секунд (10.09.2012 - 03:47) FatCat написал(а):
Цитата (rooor @ 9.09.2012 - 22:44)
str_replace при каждой замене начинает искать с начала...

Увы, нет.
$z = "zzzzzzzzzzzzzzzz";
$z = str_replace("zz","z",$z);
echo $z;

Получим никак не "z", получим "zzzzzzzz".

Спустя 9 часов, 3 минуты, 50 секунд (10.09.2012 - 12:51) Guest написал(а):
передав в str_replace 2 массива мы на выходе получим замену 2х массивов.
Каждый элемент будет заменён на свой. По порядку
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.