Недавно писал о том, как вставлять код в текст статьи. Сегодня хочу поделится способом удобной вставки кода в тело комментария.
Задача такая - в комментариях, найти теги <pre> и <code> и внутри них заменить все символы < и > на соответствующие им спецсимволы: < и >. При такой замене важно определится, когда делать эту замену. К примеру, некоторые плагины делают такую замену во время генерации страницы, т.е. всегда при открытии страницы к каждому комментарию применяется функция преобразования и измененный комментарий выводится на экран, причем я еще не видел плагина, который бы делал такую замену перед публикацией комментария, т.е. чтобы код уже с замененными символами записывался в Базу Данных, а потом просто от туда извлекался, без каких либо преобразований. По моему это логичнее и не требует лишних операций при генерации страницы. Почему авторы плагинов не используют этот подход мне не понятно.
А теперь к делу. (см. обновление)
/* Преобразуем хтмл символы < > в спецсимволы при отправке комментария */
function kama_html_replace_char_pre ($matches){
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] );
return "<pre{$matches[1]}>".$out."</pre>";
}
function kama_html_replace_char_code ($matches){
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] );
return "<code{$matches[1]}>".$out."</code>";
}
function kama_convert_html ($comment_text){ // подготавливает контент комментатора
$comment_text = preg_replace_callback ('!<pre([^>]*)>(?:\r\n|\n|\r|)(.*?)(?:\r\n|\n|\r|)</pre>!ims', 'kama_html_replace_char_pre', $comment_text);
$comment_text = preg_replace_callback ('!<code([^>]*)>(?:\r\n|\n|\r|)(.*?)(?:\r\n|\n|\r|)</code>!ims', 'kama_html_replace_char_code', $comment_text);
return $comment_text;
}
add_filter ('pre_comment_content','kama_convert_html');
Эту функцию поместите в файл functions.php вашего шаблона (вашей темы).
Что делает функция?
При публикации комментария, функция находит текст внутри тегов <pre> и/или <code> и в найденном тексте заменяет символы < и > на < и >. Замена происходит перед тем, как текст комментария записывается в Базу Данных.
Как проверить что все работает правильно?
После того, как функция была успешно помещена в файл function.php, попробуем оставить комментарий с, к примеру, таким текстом:
Проверка преобразования символов в комментариях. <div></div>
<code>Здесь будет код <div> </code>
Первый промежуточный текст <span></span>
<pre>Здесь будет код 2 <span> </pre>
Промежуточный текст <strong></strong>
<code>Здесь будет еще немного кода <div> </code>
Еще немного простого текста <b></b>
<pre>Здесь будет код <span> </pre>
В заключении еще немного текста <div></div>
В результате в Базу Данных запишется следующий текст:
Проверка преобразования символов в комментариях. <div></div>
<code>Здесь будет код <div> </code>
Первый промежуточный текст <span></span>
<pre>Здесь будет код 2 <span> </pre>
Промежуточный текст <strong></strong>
<code>Здесь будет еще немного кода <div> </code>
Еще немного простого текста <b></b>
<pre>Здесь будет код <span> </pre>
В заключении еще немного текста <div></div>
Как видим, все изменения были проведены правильно.
Такой же трюк можно сделать и с контентом статьи. Для этого внизу функции допишите еще один фильтр:
...
add_filter ('pre_comment_content','kama_convert_html');
add_filter ('content_save_pre', 'kama_convert_html'); //При обновлении поста в админке
Обновление 19.04.2010
Придумал как записать короче. Функция работает так же, как и предыдущая.
<?php
/* Преобразуем хтмл символы < > в спецсимволы при отправке комментария */
function kama_html_replace_char_code_pre ($matches){
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[3] );
return "<{$matches[1]}{$matches[2]}>".$out."</{$matches[1]}>";
}
function kama_convert_html ($comment_text){ // подготавливает контент комментатора
$comment_text = preg_replace_callback ('!<(pre|code)([^>]*)>(?:\r\n|\n|\r|)(.*?)(?:\r\n|\n|\r|)</\\1>!ims', 'kama_html_replace_char_code_pre', $comment_text);
return $comment_text;
}
add_filter ('pre_comment_content','kama_convert_html');
?>
- Предыдущие по меткам
- Предыдущие записи
- Добавляем допустимые теги в комментариях ← 2.Апр.2010 // 6
- Добавляем допустимые теги в комментариях ← 2 Апрель 2010 // 6
- Избавляемся от лишних обращений к данным ← 2 Апрель 2010 // 22
- Полезный хак для WordPress, если сайт дорабатывается на локалке ← 1 Апрель 2010 // 11
Подскажите пожалуйста, каким плагином вы пользуетесь для вывода программного кода в постах и комментариях (например, как в этом посте)?
Старой версией, немного переделанного мной скрипта SyntaxHighlighter. Последнюю версию можете скачать на домашней странице скрипта, там же можно найти инструкцию по применению.
А как вы заменили стандартные XHTML: Вы можете использовать следующие теги: <a href="" title="" rel="nofollow"> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> на кнопочки? Есть ли плагин для этого?
Кнопочки реализованы плагином: jQuery Comment Preview.
ну да а с этим как быть
на одном моем блоге от него alert
Не понял, в чем проблема?
у меня заработала только когда сделал так:
<?php /* Преобразуем хтмл символы < > в спецсимволы при отправке комментария */ function kama_html_replace_char_code_pre ($matches){ $out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[3] ); return "<{$matches[1]}{$matches[2]}>".$out."</{$matches[1]}>"; } function kama_convert_html ($comment_text){ // подготавливает контент комментатора $comment_text = preg_replace_callback ('!<(pre|code)([^>]*)>(?:\r\n|\n|\r|)(.*?)(?:\r\n|\n|\r|)</\\1>!ims', 'kama_html_replace_char_code_pre', $comment_text); return $comment_text; } add_filter ('pre_comment_content','kama_convert_html'); //Скопировал эту строку еще раз. add_filter ('pre_comment_content','kama_convert_html'); ?>И еще уже второй день думаю почему так?
str_replace (array ('<' ,'>'), array ('<','>'), $matches[3]);вроде как заменять на & lt; & gt; нужно (пробелы добавил чтобы не преобразовывалось), а так ведь строка не должна изменятся.
Поспешил, ничего не заработало
Если делаю так:
function kama_html_replace_char_code_pre ($matches){ $out = str_replace (array ('<' ,'>'), array ('& lt;','& gt;'), $matches[3] ); // без пробелов. return "<{$matches[1]}{$matches[2]}>".$out."</{$matches[1]}>"; } function kama_convert_html ($comment_text){ // подготавливает контент комментатора $comment_text = preg_replace_callback ('!<(pre|code)([^>]*)>(?:\r\n|\n|\r|)(.*?)(?:\r\n|\n|\r|)</\\1>!ims', 'kama_html_replace_char_code_pre', $comment_text); return $comment_text; } add_filter ('pre_comment_content','kama_convert_html');то сохраняется так & amp;lt; (без пробела). Думаю где-то ампресанд заменяется..
Ага, у меня в коде была ошибка, поправил. Спасибо что указали на нее.
Строка должна выглядеть так:
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[3] );Но у меня почему-то все равно не работает.
Без функции так:
админ. - кавычки преобразованы в < (и все отображается как нужно)
посетитель - теги вырезаются.
с функцией:
у админа и посетителя кавычки преобразуются в &lt;, соотвественно в комментариях выводится < вместо кавычек.
Уже по всякому пробовал, ничего не получилось пока
У вас видимо есть еще какой-то плагин, который конфликтует в этим кодом. Т.е. мой код заменяет кавычки, а тот плагин затем преобразует & в &
Привет, Тимур! С наступающим Новым Годом!
У меня вопрос по SyntaxHighlighter Evolved. Проблема такая, что при выводе кода на странице заменяются символы и другие на спец. символы. Я не хочу, чтобы они заменялись, а выводились в XHTML. Как это реализовать? Не силен в этом вопросе, к сожалению. Не поможете разобраться?
Заранее спасибо. Надеюсь на скорый ответ, желательно на e-mail.