Пробую написать костыль ради интереса. Не могу с регулярками разобраться никак.
class text {
static function htmlspecialchars ($text = '',$tags = array('b','strong','code','div','ul','li','i','u','s','br','a','img','h1','h2','h3','h4','h5','h6')) {
$search = array();
$replace = array();
foreach ($tags as $key => $tag) {
$search1[] = '|<(.*?)'.$tag.'(.*?)>|';
$replace1[] = '◄$1'.$tag.'$2►';
$search2[] = '|◄(.*?)'.$tag.'(.*?)►|';
$replace2[] = '<$1'.$tag.'$2>';
}
return preg_replace($search2, $replace2, htmlspecialchars(
preg_replace($search1, $replace1, $text)
,ENT_NOQUOTES
));
}
}
$text = '<i>курсив</i> <b>жирный</b> <code class="php">код</code>';
echo text::htmlspecialchars($text,array('code','b'));
Идея в том что разрешенные теги в тексте сначало заменяются на хрень где вместо < стоит ◄, потом этот текст обрабатывается htmlspecialchars , а потом обротно заменяются ◄ на <
Во первых не допру как убрать вторые переменные $search2,$replace2, просто поменять местами массивы не получается из за разделителя |
Во вторых получаются разного рода баги, подозреваю что из за (.*?)
Смысл <(.*?) был в том, что бы поменять теги </b> и <b> одновременно, те у которых есть слеш и те у которых нет, но фиг знает как туда слеш вставить.
Смысл (.*?)> был в том, что бы поменять теги с атрибутами и без.
Код который в примере работает, но например <div><b>жирный</b></div> уже глючит.
Подскажите)
_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2