Перейти к контенту

Обработать одним pre_replace большую часть смайлов


Рекомендуемые сообщения

При обработке смайлов перед отправкой поста в БД количество preg_replace (которое просматривает весь текст) равно количеству смайлов. Предлагаю смайлики разделить на две группы: обычные ( такие как ":)" ) и те, где текст между двоеточиями (такое как :blink:).

 

Обычные нужно обрабатывать стандартным способом. А другие будут иметь вид :smile: и переделываться в <!--emo&:smile:--><img src='html_directory/emoticons/smile.gif' border='0' style='vertical-align:middle' alt='smile' /><!--endemo-->.

 

Как у себя реализовал.

 

В пост_парсере, перед обычной вставкой смайлов установил такую строку:

$txt = preg_replace( "#\:([a-zA-Z0-9_\-+]+)\:#ie", "\$this->regex_check_img_emoticon('\\1')", $txt );

 

Т.е. мы преобразвываем по функции regex_check_img_emoticon все, что находится между двоеточиями содержащее символы латинскго алфавита, или цифры, или "_", "-", "+".

 

Функция regex_check_img_emoticon обрабатывает то, что между двоеточиями, считает кол-во смайлов, проверяет есть ли файл "папка_смайлов/то_что_между_двоеточиями.gif". В случае существования файла и не превышения максимально дозволеного кол-ва смайлов в посте перерабатываем ту подстроку в смайл.

 

function regex_check_img_emoticon($url="") {
               global $ibforums;

               if (!$url) return;

               $default = ":".$url.":";

               // Make sure we've not overriden the set image # limit
               $emo_url=$ibforums->vars['html_dir']."emoticons/{$url}.gif";
               if (!file_exists($emo_url)) return $default;

               ++$this->emoticon_count;

               if ($ibforums->vars['max_emos'])
               {
                       if ($this->emoticon_count > $ibforums->vars['max_emos'])
                       {
                               $this->error = 'too_many_emoticons';
                               return $default;
                       }
               }
               return "<!--emo&:{$url}:--><img src='{$ibforums->vars['EMOTICONS_URL']}/{$url}.gif' border='0' style='vertical-align:middle' alt='$image' /><!--endemo-->";
}

 

На две групы смайлы разделены полем parse_type в таблице ibf_emoticons.

 

И запрос к обычным смайлам (перед самой обработкой):

$DB->query("SELECT typed, image from ibf_emoticons [b]WHERE parse_type=0[/b]");

Т.е. уже количество preg_replace для смайлов не количество_смайлов, а количество_смайлов_с_parse_type=0+1.

 

Можно еще одну группу смайлов выделить - которые вставляются тэгом .

 

Если надо перерабатывать не только в gif, то наш шаблон смайлов можно изменить что-то вроде :smile*:, где * значит что gif, а если вместо * стоит например, +, то это будет jpg.

 

Ну и в админке уже генерировать это поле "before" если указано parse_type=1.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.