Просто используйте одну функцию preg_replace()
с модификатором e , чтобы выполнить функцию htmlenteties()
для всего, что найдено в <code>
тегах
EDITED
function allowedHtml($str) {
$str = htmlentities($str, ENT_QUOTES, "UTF-8");
$allowed_tags = array("b", "strong", "i", "em", "code");
foreach ($allowed_tags as $tag) {
$str = preg_replace("#<" . $tag . ">(.*?)</" . $tag . ">#i", "<" . $tag . ">$1</" . $tag . ">", $str);
}
return $str;
}
$reply = allowedHtml($_POST['reply']);
$reply = preg_replace("#\<code\>(.+?)\</code\>#e", "'<code>'.htmlentities('$1', ENT_QUOTES, 'UTF-8').'</code>'", $reply);
$reply = str_replace("&", "&", $reply);
Переписал вашу функцию allowedHtml()
и добавил str_replace()
в конце.
Он протестирован и теперь должен отлично работать:)
ОБНОВЛЕНО - НОВОЕ РЕШЕНИЕ
function convertHtml($reply, $revert = false) {
$specials = array("**", "*", "_", "-");
$tags = array("b", "i", "u", "s");
foreach ($tags as $key => $tag) {
$open = "<" . $tag . ">";
$close = "</" . $tag . ">";
if ($revert == true) {
$special = $specials[$key];
$reply = preg_replace("#" . $open . "(.+?)" . $close . "#i", $special . "$1" . $special, $reply);
}
else {
$special = str_replace("*", "\*", $specials[$key]);
$reply = preg_replace("#" . $special . "(.+?)" . $special . "#i", $open . "$1" . $close, $reply);
}
}
return $reply;
}
$reply = htmlentities($reply, ENT_QUOTES, "UTF-8");
$reply = convertHtml($reply);
$reply = preg_replace("#[^\S\r\n]{4}(.+?)(?!.+)#i", "<pre><code>$1
", $ reply);
$ reply = preg_replace ("# \ </ code \> \ </ pre \> (\ s *) \
\ # i", "$ 1", $ reply);
$ reply = nl2br ($ reply);
$ reply = preg_replace ("# \ \ (. *?) \ </ code \> \ </ pre \> # se", "''.convertHtml(str_replace('<br />', '', '$1'), true).'
'", $ reply);
Обсудили другое решение, и приведенный выше код это исправит. Он работает так же, как преобразование Stack Overflow html, что означает, что ** становится жирным шрифтом, * становится курсивом, _ становится подчеркнутым и - "зачеркнутым". Кроме того, все строки, начинающиеся с 4 или более пробелов, будут выводиться как код