Этот мод может понадобиться только если была допущена ошибка при работе с модом Adaptive Hide BBCode и установлен мод кэша для гостей и ботов.
Свежий пример:
1) есть конференция, на которой когда-то публиковались ссылки на файлы в файлообменниках
2) ссылки были скрыты от гостей и ботов ББ-кодом hide (есть такой мод адаптивного сокрытия), в котором была допущена ошибка при использовании - нет номера после "=", в результате чего получается текст:
Код: Выделить всё
[hide=]ссылка[/hide]4) антивирусник на хостинге ругается на темы, где применён ошибочный ББ-код, поскольку кое-какие старые ссылки ведут на malware и т.п. радости
Если отключить кэш для гостей и ботов, антивирусник ничего плохого не говорит. Происходит это потому, что без мода кэша подстановочные данные - неверный hide= и ссылка - хранятся в других файлах и безобидны, а с кэшем они попадают в темплейт (что разумно сделано, ибо немного разгружает сервер). Вот получившийся темплейт вместе со вставкой ссылки и понимается антивирусной программой как некая зараза :-)
Итак, лечение простое - делаем хук-функцию:
Код: Выделить всё
<?php
//
// phpBB hook_antibadhide
// version 0.0.1 - 20131121
// copyright (c) 2013 c61 http://www.phpbbguru.net & http://c61.no-ip.org
// license http://opensource.org/licenses/gpl-license.php GNU Public License
//
if (!defined('IN_PHPBB'))
{
exit;
}
function antibadhide()
{
global $template;
if(isset($template->_tpldata['postrow']))
{
// Применяем функцию do_antibadhide() к каждому члену массива postrow, содержащего тексты сообщений
foreach($template->_tpldata['postrow'] as $key => $val)
{
do_antibadhide($template->_tpldata['postrow'][$key]['MESSAGE']);
}
} elseif (isset($template->_rootref))
{
// Применяем функцию do_antibadhide() к предпросмотру сообщения
do_antibadhide($template->_rootref['PREVIEW_MESSAGE']);
}
}
function do_antibadhide(&$item)
{
global $user;
if(!isset($item)) return;
if(!($user->data['is_bot'] || ($user->data['user_id'] == ANONYMOUS))) return;
// Разыскиваемые тэги
// Будут исключены:
// code - это код и незачем...
// script - скрипты тем более не трогаем
$tags = array("code","script");
$ent = array();
foreach($tags as $tag)
{
// Поиск тэга
if(preg_match_all("/(?=(<$tag.*?>(?>(?1)|.)*?<\/$tag>))/isu",$item,$matches,PREG_OFFSET_CAPTURE))
{
foreach($matches[1] as $match)
{
// Собираем вхождения тэгов в массив 'индекс' => 'длина'
$ent[(int) $match[1]] = (int) strlen($match[0]);
}
}
}
// Добавляем пустышку - чтобы алгоритм обработал остатки текста за последним тэгом
$ent[(int) strlen($item)] = (int) 0;
// Сортируем по ключу, по возрастанию
if(ksort($ent))
{
// Начальный индекс, новый текст
$start = 0;
$newtext = '';
// Проход по всем вхождениям
foreach($ent as $key => $val)
{
if($key > $start) // Индекс больше стартового ?
{
// Да. Выделяем подстроку
$substr = substr($item,$start,$key-$start);
// Поиск [hide=]...[/hide]
if(preg_match_all("/\[hide\=\].*?\[\/hide\]/isu",$substr,$matches,PREG_OFFSET_CAPTURE))
{
$search = array();
$replace = array();
foreach($matches[0] as $match)
{
// Коллекционируем поиски и замены
$search[] = $match[0];
$replace[] = ' ...hidden text... ';
}
// Проводим замены
$substr = str_replace($search,$replace,$substr);
}
// Отправляем подстроку с заменами в результирующий текст
$newtext .= $substr . ($val ? substr($item,$key,$val) : '');
// Переопределяем начальный индекс
$start = $key + $val;
}
}
// Если всё нормально - переопределяем текст сообщения
if($newtext != '')
{
$item = $newtext;
}
}
}
// Регистрируем хук
$phpbb_hook->register(array('template', 'display'), 'antibadhide');
?>P.S. Так же лечится ошибка ghide= и любые подобные.

