Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Что то не понятное с preg_replace
VolDroN  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



echo $this->getStatus();
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 576
Пользователь №: 25702
На форуме: 6 лет, 2 месяца, 21 день
Карма: 17

Трезвый :
4 года, 3 месяца, 7 дней


Что то не понятное творится с 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
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса