Преобразование текстовых смайлов в графические

Статус
В этой теме нельзя размещать новые ответы.

Bars

Новичок
Это, конечно, можно сделать с помощью функции str_replace(), но преобразовывать таким методом каждый смайл в сообщении очень громоздко, тем более, если вариаций смайлов слишком много. Не писать же для каждого смайла отдельный str_replace :)

Как можно найти все смайлы в сообщении и заменить их на графические? Пробовал так:
PHP:
$text = $_POST['text']; // У себя я это дело обрабатываю
$smiles = array('*smile*', '*winked*', '*cool*');
$replace = array('smile', 'winked', 'cool');
str_replace($smiles, '<img src="/tpl/img/smiles/'.$replace.'.gif" align="absmiddle" />', $text);
Но они заменяются на <img src="Array" align="absmiddle" />

Надеюсь на Вашу помощь.

PS: У меня PHP 5.2.
 

Zvook

Новичок
PHP:
str_replace($smiles, '<img src="/tpl/img/smiles/'.$replace.'.gif" align="absmiddle" />', $text);
Ты вторым параметром тут передаешь строку. В твоем случае надо чтобы это был массив. Вобщем заворачивать $replace в <img> тег надо в другом месте, после реплейса возможно.
 

Zvook

Новичок
Ну хотябы даже вот так
PHP:
$text = 'текст со *smile* смайликом *cool*';
$smiles = array('*smile*','*cool*');
$replace = array('<img src="/tpl/img/smiles/smile.gif" align="absmiddle" />', '<img src="/tpl/img/smiles/cool.gif" align="absmiddle" />');
str_replace($smiles, $replace, $text);
 

Bars

Новичок
Это тоже как-то громоздко. Может можно циклом обрабатывать как-то или функцией?
 

Zvook

Новичок
Можно подумать, но так или иначе придется искать вхождения смайликов в тексте и заменять их на изображение. Разве что код изображения самого можно уменьшить
 
  • Like
Реакции: Bars

radioheaded

PHP нуб
Вам кажется, что это громоздко, потому что вы запихали HTML в исходный код на PHP. Максимум, вы должны преобразовать текстовый смайлик в имя файла, но не более. HTML должен быть в отображении. Пути к файлам могут быть в конфиге.
 

Zvook

Новичок
Вам кажется, что это громоздко, потому что вы запихали HTML в исходный код на PHP. Максимум, вы должны преобразовать текстовый смайлик в имя файла, но не более. HTML должен быть в отображении. Пути к файлам могут быть в конфиге.
А как по другому? Тут 2 варианта, либо заменять смайлик на изображение при сохранении в базу (что правильнее), либо при выводе текста в отображении. Но все равно придется заменять *cool* на <img src="">. PHP код в базу данных не положишь :)
 

radioheaded

PHP нуб
А как по другому? Тут 2 варианта, либо заменять смайлик на изображение при сохранении в базу (что правильнее), либо при выводе текста в отображении. Но все равно придется заменять *cool* на <img src="">. PHP код в базу данных не положишь :)
Вы вообще о другом. Посмотрите на претензию ТС: «как-то громоздко». Чувак хочет встроенную функцию PHP в идеале, которая сделает все сама. Тогда это будет выглядеть не громоздко. Я лишь объяснил, почему ему так кажется.

И сохранять замену сразу в БД плохая идея. Когда вам понадобится поменять пути к статике или выводить смайлы как-то по-другому, вы будете долго ругаться и либо обновлять все сообщения в БД, либо трахаться с реврайтами в конфигах веб-сервера.
 

Zvook

Новичок
И сохранять замену сразу в БД плохая идея. Когда вам понадобится поменять пути к статике или выводить смайлы как-то по-другому, вы будете долго ругаться и либо обновлять все сообщения в БД, либо трахаться с реврайтами в конфигах веб-сервера.
Согласен, но тут, имхо, меньшее из двух зол. Найти все смайлики в БД и заменить на другие не такая уж и проблема, тем более такое случается не часто :)
А если держать смайлики кодами типа *cool* в базе, то при каждом дисплее php скрипту придется бежать по всему тексту (а он может быть не маленьким) и заменять код на картинку. Тоже не айс ) Обезьяний труд, фактически :)
 

radioheaded

PHP нуб
Согласен, но тут, имхо, меньшее из двух зол. Найти все смайлики в БД и заменить на другие не такая уж и проблема, тем более такое случается не часто :)
А если держать смайлики кодами типа *cool* в базе, то при каждом дисплее php скрипту придется бежать по всему тексту (а он может быть не маленьким) и заменять код на картинку. Тоже не айс ) Обезьяний труд, фактически :)
Смотря о приложениях каких масштабов мы говорим. Если БД достаточно большая, то таблица сообщений, вероятней всего, шардится. Тогда задача консистентного реплейса не такая уж тривиальная. Я не говорю, что это сложно, но изменить код в одном месте в разы легче.

А бояться оверхеда на str_replace это, ну не знаю, как бояться оверхеда при использовании объектов. Это ж, представляете, как вы говорите, при каждом дисплее пхп скрипту приходится конструировать объекты, тогда как он мог бы просто вызвать функцию! Тогда уж лучше вообще пхп не использовать.
 

Zvook

Новичок
Смотря о приложениях каких масштабов мы говорим. Если БД достаточно большая, то таблица сообщений, вероятней всего, шардится. Тогда задача консистентного реплейса не такая уж тривиальная. Я не говорю, что это сложно, но изменить код в одном месте в разы легче.

А бояться оверхеда на str_replace это, ну не знаю, как бояться оверхеда при использовании объектов. Это ж, представляете, как вы говорите, при каждом дисплее пхп скрипту приходится конструировать объекты, тогда как он мог бы просто вызвать функцию! Тогда уж лучше вообще пхп не использовать.
:) Я не говорю что это критично, конечно оверхед изза этого не возникнет. Может, Вы и правы :) Просто мне это кажется лишней операцией, как я уже упомянул, обезьяний труд, прогонять весь текст при каждом выводе через str_replace. Более того, с трудом себе представляю такую ситуацию, когда надо внезапно начать выводить смайлики из другого места.... А ксс стили для них можно прописать наследованием. Более того, можно и сами картинки КСС стилями тянуть, тогда в базе останется только элемент и поменять путь к картинке не составит никакого труда.
 

radioheaded

PHP нуб
:) Я не говорю что это критично, конечно оверхед изза этого не возникнет. Может, Вы и правы :) Просто мне это кажется лишней операцией, как я уже упомянул, обезьяний труд, прогонять весь текст при каждом выводе через str_replace. Более того, с трудом себе представляю такую ситуацию, когда надо внезапно начать выводить смайлики из другого места.... А ксс стили для них можно прописать наследованием. Более того, можно и сами картинки КСС стилями тянуть, тогда в базе останется только элемент и поменять путь к картинке не составит никакого труда.
Вы так говорите про обезьяний труд, как будто эти замены выполняете вы сами лично своими руками каждый раз, когда пользователь отправляет сообщение. Это же строка кода, чувак, она работает сама по себе.

А про «с трудом себе представляю такую ситуацию» — я раньше тоже много всего с трудом представлял. В какой-то момент фантастика становится жуткой реальностью, и лучше быть к этому готовым.
 

Zvook

Новичок
Это же строка кода, чувак, она работает сама по себе.
Ну это определенно радует ))

А если там будут помимо смайликов еще другие теги, <span> например? Это то же самое по сути, это html тег который хранится вместе в текстом в базе данных, а при выводе стилизуется стилями родительского блока, в который выводится. Другими словами, какая разница что хранить в базе html тег или его "код", который потом на этот же тег заменять?
 

radioheaded

PHP нуб
Ну это определенно радует ))

А если там будут помимо смайликов еще другие теги, <span> например? Это то же самое по сути, это html тег который хранится вместе в текстом в базе данных, а при выводе стилизуется стилями родительского блока, в который выводится. Другими словами, какая разница что хранить в базе html тег или его "код", который потом на этот же тег заменять?
Мне правда сейчас не хочется объяснять, зачем разработчики придумали разные методы разметки и форматирования, всякие там bb-коды и прочее. Ответьте себе хотя бы на самый простой вопрос, который, похоже, до сих пор не пришел вам в голову: а зачем вообще тогда использовать в редакторе какую-то разметку смайлика вместо уже готового HTML-кода? Потом еще в качестве заключения почитайте про xss-атаки второго уровня (или как-то так, не помню точно, как они называются).
 

Zvook

Новичок
Мне правда сейчас не хочется объяснять, зачем разработчики придумали разные методы разметки и форматирования, всякие там bb-коды и прочее. Ответьте себе хотя бы на самый простой вопрос, который, похоже, до сих пор не пришел вам в голову: а зачем вообще тогда использовать в редакторе какую-то разметку смайлика вместо уже готового HTML-кода? Потом еще в качестве заключения почитайте про xss-атаки второго уровня (или как-то так, не помню точно, как они называются).
Хорошо, почитаю. В целом согласен, далеко я зашел.
 

Bars

Новичок
А если держать смайлики кодами типа *cool* в базе, то при каждом дисплее php скрипту придется бежать по всему тексту (а он может быть не маленьким) и заменять код на картинку. Тоже не айс ) Обезьяний труд, фактически :)
Вот поэтому я и записываю их в БД. Ведь комментарий добавляется один-два раза, а запрос новости (просмотр) десятки раз в сутки. А код заменить по всей базе не составляет труда, имхо.

а зачем вообще тогда использовать в редакторе какую-то разметку смайлика вместо уже готового HTML-кода?
Если в редакторе будет сразу вставляться <img src="имя_смайла.gif" align="absmiddle" />, то пользователи смогут вставлять в комментарии помимо смайлов изображения; и, что не исключено, снифферы (например, http://free.host/image.php).

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

А про «с трудом себе представляю такую ситуацию» — я раньше тоже много всего с трудом представлял. В какой-то момент фантастика становится жуткой реальностью, и лучше быть к этому готовым.
Если смайлов 100, то смысл для каждого писать отдельный реплейс? В человеческих CMS, например, есть строка, в которую через запятую записываются имена смайлов. Что я хочу этим сказать?

PHP код нельзя модифицировать скриптом. То есть, при внесении смайлов через запятую в настройках, их "реплейсы" не добавятся в скрипт, отвечающий за добавление комментариев.

И всё же, функцией парсить текст на смайлы гораздо практичнее. В этом и заключается суть моего вопроса.

В принципе, можно вписать смайлы в строку и взять их в массив через explode. Но и тут понадобится функция поиска по тексту и преобразование.
 

Bars

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