[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Что то не понятное с preg_replace
VolDroN
Что то не понятное творится с preg_match, есть такая штука:
preg_match_all('#\{fragment:(.*)\}#', $html, $replaces);
foreach($replaces[1] as $value)
{
if(!isset($this->tpls[$value]))
$this->tpls[$value] = '';

preg_replace('#\{fragment:'.$value.'\}#', $this->_replaceSpecialTag($this->tpls[$value]['html']), $html);
}


так вот, preg_replace не находит ни одного совпадения. str_replace тоже не хочет работать. Переписываю небольшой шаблонизатор (забыл сделать бэкап когда винду сносил :angry: , хотя это к лучшему, т.к. тогда я сам не понимал как он работает, куча говнокода была) и там была та же проблема, её я решил костылём
как то так:
preg_replace('#'.str_replace('{', '\{', str_replace('}', '\}', $replaces[0][$key])).'#', ...

не пойму почему не хочет работать с '#\{fragment:'.$value.'\}#'?



Спустя 8 минут, 30 секунд (17.01.2012 - 16:36) VolDroN написал(а):
оу.. str_replace всё таки стал работать)

Спустя 8 минут, 6 секунд (17.01.2012 - 16:44) inpost написал(а):
Модификаторы: iusU добавь

Спустя 12 минут, 45 секунд (17.01.2012 - 16:57) killer8080 написал(а):
Цитата (VolDroN @ 17.01.2012 - 15:27)
Что то не понятное творится с preg_match, есть такая штука:
preg_match_all('#\{fragment:(.*)\}#', $html, $replaces);
foreach($replaces[1] as $value)
{
if(!isset($this->tpls[$value]))
  $this->tpls[$value] = '';
   
preg_replace('#\{fragment:'.$value.'\}#', $this->_replaceSpecialTag($this->tpls[$value]['html']), $html);
}


так вот, preg_replace не находит ни одного совпадения. str_replace тоже не хочет работать. Переписываю небольшой шаблонизатор (забыл сделать бэкап когда винду сносил  :angry: , хотя это к лучшему, т.к. тогда я сам не понимал как он работает, куча говнокода была) и там была та же проблема, её я решил костылём
как то так:
preg_replace('#'.str_replace('{', '\{', str_replace('}', '\}', $replaces[0][$key])).'#', ...

не пойму почему не хочет работать с '#\{fragment:'.$value.'\}#'?

Дык ты же никуда не сохранял результат замены preg_replace user posted image
Нужно было как так
$html = preg_replace('#\{fragment:'.$value.'\}#', $this->_replaceSpecialTag($this->tpls[$value]['html']), $html);




Спустя 12 минут, 35 секунд killer8080 написал(а):
VolDroN
Вообще у тебя не рациональное решение. Сначала прогоняешь контент через регулярку, а потом ещё и в цикле регулярками по нему проходишь. Нагрузка не оправданная. Не проще было использовать preg_replace_callback()?

Спустя 1 час, 42 минуты, 26 секунд (17.01.2012 - 18:39) VolDroN написал(а):
всем спасибо, разобрался)

preg_replace_callback() не слышал), а как её можно тут использовать?

в цикле регулярками? в классе передаётся на эту функцию (replaceSpecialTag) главный шаблон (<html>..</html>). Регулярка ищет вставленные фрагменты,{fragment:fragmentName}, и вставляет туда html код с именем fragmentName и рекурсивно по нему проходится что бы поддерживались вложенные фрагменты.

Спустя 2 часа, 11 минут, 15 секунд (17.01.2012 - 20:50) killer8080 написал(а):
Цитата (VolDroN @ 17.01.2012 - 17:39)
preg_replace_callback() не слышал), а как её можно тут использовать?

именно её тут и нужно использовать. Разбор текста регулярками, задача сама по себе ресурсоемкая, а тут ты её ещё и многократно вызываешь, для того чтоб она нашла то что уже находила. Если шаблон будет большой, нагрузка будет солидной, причем совершенно не оправданно.
В общем в класс добавляешь колбэк метод
public function replaceCallback($m){
return isset($this->tpls[$m[1]] ? $this->tpls[$m[1]] : '';
}

обработку делаешь так
$html = preg_replace_callback('#\{fragment:(.*)\}#', array($this, 'replaceCallback'), $html);

Спустя 1 день, 17 часов, 19 минут, 29 секунд (19.01.2012 - 14:10) VolDroN написал(а):
Всё, понял. Спасибо smile.gif
Быстрый ответ:

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