Автоматическое удаление повторяющихся смайликов в сообщении

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Поручик
Former team member
Сообщения: 3942
Стаж: 21 год 4 месяца
Откуда: Оренбург (Южный Урал)
Благодарил (а): 24 раза
Поблагодарили: 54 раза

Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение Поручик »

Спросили в привате на офсайте.
Ищется идея, как в сообщении автоматически заменить несколько подряд идущих одинаковых смайликов.
Сама тема с демонстрацией здесь.
Reduce Smilies
http://www.phpbb.com/community/viewtopi ... &t=1300325

Добавлено спустя 17 минут 8 секунд:
А собственно, идея есть. В цикле по таблице смайлов сформировать массив регулярок и потом заменить на один смайлик. Примерно также делается в автоцензоре. Вечером проверю.
Всем спасибо за советы.
Профессионал - тот же дилетант, только знающий, где ошибётся.
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции

наш форум http://forum.aeroion.ru/cat1.html
Аватара пользователя
Поручик
Former team member
Сообщения: 3942
Стаж: 21 год 4 месяца
Откуда: Оренбург (Южный Урал)
Благодарил (а): 24 раза
Поблагодарили: 54 раза

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение Поручик »

Нет, нихрена не получается с регулярками. Думается мне, что решать задачу надо через разбиение строки на массив по пробелам, далее цикл по массиву, удалять повторяющиеся смайлики, а потом объединять строку из массива. Что-то вроде связки preg_split, implode.
Но как-то всё по жо%&*ному выглядит.

Кстати, нашел тему для двойки
http://www.phpbbguru.net/community/topic12495.html
Профессионал - тот же дилетант, только знающий, где ошибётся.
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции

наш форум http://forum.aeroion.ru/cat1.html
Аватара пользователя
Поручик
Former team member
Сообщения: 3942
Стаж: 21 год 4 месяца
Откуда: Оренбург (Южный Урал)
Благодарил (а): 24 раза
Поблагодарили: 54 раза

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение Поручик »

Как-то так получилось

Код: Выделить всё

		$message_array = preg_split ('/[ ]+/', $this->message);//explode(' ', $this->message);
		foreach ($smiles_code as $smile_code) 
		{
			$i = 0; ;
			while ($i <= sizeof($message_array))
			{
				$str = ($message_array[$i] == $smile_code) ? $smile_code : '';
				if ($str == $smile_code && $message_array[$i + 1] == $smile_code)
				{
					array_splice($message_array, $i + 1, 1);
				}
				else
				{
					$i++;
				}
			}
		}
		$this->message = implode(' ', $message_array);
Может и не совсем красиво, но зато работает.

Добавлено спустя 17 минут 30 секунд:
Типа "тихо сам с собой я веду беседу".
Недостатки данного подхода видны сразу: в сообщении режутся все повторяющиеся пробелы, что возможно будет недопустимо для текста в тэге code.
В общем задачка нетривиальная, судя по тому, что в аналогичной теме для двойки так никто и не ответил, даже тогдашние корифеи.
Профессионал - тот же дилетант, только знающий, где ошибётся.
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции

наш форум http://forum.aeroion.ru/cat1.html
Аватара пользователя
RedNaxi
Former team member
Сообщения: 933
Стаж: 19 лет 7 месяцев
Откуда: BeBoss.ru
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение RedNaxi »

А такой вариант:

Код: Выделить всё

open 
includes/message_parser.php
find
				//(assertion)
				$match[] = '(?<=^|[\n .])' . preg_quote($row['code'], '#') . '(?![^<>]*>)';
				$replace[] = '<!-- s' . $row['code'] . ' --><img src="{SMILIES_PATH}/' . $row['smiley_url'] . '" alt="' . $row['code'] . '" title="' . $row['emotion'] . '" /><!-- s' . $row['code'] . ' -->';
replace with
				//(assertion) [edited] reduce smiles by RedNaxi
				$match[] = '(([ ]*)(?<=^|[\n .])' . preg_quote($row['code'], '#') . '(?![^<>]*>))+';
				$replace[] = ' <!-- s' . $row['code'] . ' --><img src="{SMILIES_PATH}/' . $row['smiley_url'] . '" alt="' . $row['code'] . '" title="' . $row['emotion'] . '" /><!-- s' . $row['code'] . ' -->';
у меня вроде работает
Последний раз редактировалось RedNaxi 17.11.2008 18:09, всего редактировалось 1 раз.
Аватара пользователя
Поручик
Former team member
Сообщения: 3942
Стаж: 21 год 4 месяца
Откуда: Оренбург (Южный Урал)
Благодарил (а): 24 раза
Поблагодарили: 54 раза

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение Поручик »

Так, небольшое дополнение. Удалим все повторяющиеся смайлы до проверки на максимальное количество их в сообщении. Таким образом, окончательное? решение выглядит так:

Код: Выделить всё

#
#--- [OPEN] ---------------
#
includes/message_parser.php
#
#--- [FIND] ---------------
#
            $match[] = '(?<=^|[\n .])' . preg_quote($row['code'], '#') . '(?![^<>]*>)';
            $replace[] = '<!-- s' . $row['code'] . ' --><img src="{SMILIES_PATH}/' . $row['smiley_url'] . '" alt="' . $row['code'] . '" title="' . $row['emotion'] . '" /><!-- s' . $row['code'] . ' -->';
#
#--- [REPLACE WITH] ---------------
#
           //[edited] reduce smiles by RedNaxi
            $match[] = '(([ ]*)(?<=^|[\n .])' . preg_quote($row['code'], '#') . '(?![^<>]*>))+';
            $replace[] = ' <!-- s' . $row['code'] . ' --><img src="{SMILIES_PATH}/' . $row['smiley_url'] . '" alt="' . $row['code'] . '" title="' . $row['emotion'] . '" /><!-- s' . $row['code'] . ' -->';

#
#--- [FIND] ---------------
#
			if ($max_smilies)
			{

#
#--- [Add Before] ---------------
#
			$this->message = trim(preg_replace(explode(chr(0), '#' . implode('#' . chr(0) . '#', $match) . '#'), '\1', $this->message));
Добавлено спустя 12 минут 41 секунду:
Товарищ updown благодарит всех.
Thank you very much!! I also will try your coding from the request-topic this late evening!
Профессионал - тот же дилетант, только знающий, где ошибётся.
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции

наш форум http://forum.aeroion.ru/cat1.html
Аватара пользователя
Поручик
Former team member
Сообщения: 3942
Стаж: 21 год 4 месяца
Откуда: Оренбург (Южный Урал)
Благодарил (а): 24 раза
Поблагодарили: 54 раза

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение Поручик »

А кто бы тупо посмотрел на функцию smiley_text() в functions_content.php, чтобы найти решение, как удалить повторяющиеся смайлики в существущих постах при генерации страницы?
Профессионал - тот же дилетант, только знающий, где ошибётся.
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции

наш форум http://forum.aeroion.ru/cat1.html
Аватара пользователя
RedNaxi
Former team member
Сообщения: 933
Стаж: 19 лет 7 месяцев
Откуда: BeBoss.ru
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение RedNaxi »

в общем я
Поручик писал(а): тупо посмотрел на функцию smiley_text() в functions_content.php
и родил такое решение:

Код: Выделить всё

find
return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/.*? \/><!\-\- s\1 \-\->#', '\1', $text);

replace with
return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/(.*?) \/><!\-\- s\1 \-\->([\s]*<!\-\- s\1 \-\-><img src="\{SMILIES_PATH\}\/\2 \/><!\-\- s\1 \-\->)*#', '\1', $text);

find
return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/(.*?) \/><!\-\- s\1 \-\->#', ' <img src="' . $phpbb_root_path . $config['smilies_path'] . '/\2 />', $text);

relace with
return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/(.*?) \/><!\-\- s\1 \-\->([\s]*<!\-\- s\1 \-\-><img src="\{SMILIES_PATH\}\/\2 \/><!\-\- s\1 \-\->)*#', ' <img src="' . $phpbb_root_path . $config['smilies_path'] . '/\2 />', $text);
вроде работает
Аватара пользователя
Палыч
Former team member
Сообщения: 9683
Стаж: 20 лет 4 месяца
Откуда: Питер
Благодарил (а): 3 раза
Поблагодарили: 454 раза

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение Палыч »

маленькая ложка дёгтя....
если повтор разбивается, то не сработает
например
:mrgreen: :geek: :mrgreen: :geek: :mrgreen: :geek:
Не все то WINDOWS, что висит... phpBB только учусь.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.
Аватара пользователя
RedNaxi
Former team member
Сообщения: 933
Стаж: 19 лет 7 месяцев
Откуда: BeBoss.ru
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Re: Автоматическое удаление повторяющихся смайликов в сообщении

Сообщение RedNaxi »

задача была:
updown писал(а):I want to disallow more than one identical smiley in a row and reduce them automatically to one smiley

For example:
:idea: :idea: :idea: :idea: :idea: :idea: :idea:

output:
:idea:


or an other example:
:lol: :lol: 8-) 8-) 8-) :D :D

will be:
:lol: 8-) :D


Has anybody an idea how to implement this in message_parser?
так что задача по сути решена:)
про разбивающийся повтор ни слова, хотя можно конечно подумать, регулярками решаемо я думаю, да только каждое усложнение будет давать лишнюю нагрузку...

Вернуться в «Для авторов (phpBB 3.0.x)»