WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Меняем HTML символы (< >) на спецсимволы при комментировании

Недавно писал о том, как вставлять код в текст статьи. Сегодня хочу поделится способом удобной вставки кода в тело комментария.

Задача: в комментариях, найти теги <pre> и <code> и внутри них  заменить все символы < и > на соответствующие им спецсимволы: &lt; и&gt;.

Тут важно определится, когда делать замену. К примеру, некоторые плагины делают замену во время генерации страницы, т.е. всегда при открытии страницы к каждому комментарию применяется функция преобразования и измененный комментарий выводится на экран. Я еще не видел плагина, который бы делал замену перед записью текста в базу данных, чтобы потом просто получить текст, без преобразований. Мне кажется это лучшим подходом. В крайнем случае всегда можно обратно произвести замену, там где это нужно...

Решение задачи (новая версия кода):

add_filter('pre_comment_content', 'kama_convert_html');
/*
 * Преобразует html символы: < > внутри тегов pre|code во спецсимволы < > в тексте
 * v1.0
 */
function kama_convert_html_entities( $text, $convert_in='pre|code|var'){
	return preg_replace_callback ('!<('. $convert_in .')([^>]*)>(.*?)</\\1>!ims', '__kama_convert_html_entities_cb', $text);
}
function __kama_convert_html_entities_cb( $matches ){
	$out = str_replace( array('<','>'), array('<','>'), $matches[3] );
	$out = preg_replace( "~((?<=\n|^|\t))[ ]{4}~m", "\\1\t", $out ); // заменяем 4 пробела на табы

	return "<$matches[1]$matches[2]>$out</$matches[1]>";
}

Функцию поместите в файл functions.php вашего шаблона (вашей темы).

Что делает функция?

При публикации комментария, функция находит текст внутри тегов <pre> и/или <code> и в найденном тексте заменяет символы < и > на &lt; и &gt;.

Замена происходит перед тем, как текст комментария записывается в Базу Данных. Если нужно заменять прямо перед выводом текста на экран, то замените строку:

add_filter('pre_comment_content', 'kama_convert_html');
// на
add_filter('comment_text', 'kama_convert_html');

 

Как проверить что все работает?

После установки функции попробуйте оставить комментарий с таким текстом:

Проверка преобразования символов в комментариях. <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>Здесь будет код &lt;div&gt; </code>
Первый промежуточный текст <span></span>
<pre>Здесь будет код 2 &lt;span&gt; </pre>
Промежуточный текст <strong></strong>
<code>Здесь будет еще немного кода &lt;div&gt; </code>
Еще немного простого текста <b></b>
<pre>Здесь будет код &lt;span&gt; </pre>
В заключении еще немного текста <div></div>

Сохранение любого кода в тексте статьи (поста)

Такой же трюк можно сделать и с контентом статьи. Для этого внизу функции допишите еще один фильтр:

add_filter('pre_comment_content', 'kama_convert_html');
// При обновлении поста в админке
add_filter('content_save_pre', 'kama_convert_html');

Старая версия

Старая (первая) версия кода, работает также, только код более длинный:

/* Преобразуем хтмл символы  < > в спецсимволы при отправке комментария */
function kama_html_replace_char_pre( $matches ){
	$out = str_replace (array ('<'   ,'>'),   array ('&lt;','&gt;'),  $matches[2] );
	return "<pre{$matches[1]}>".$out."</pre>";
}
function kama_html_replace_char_code ($matches){
	$out = str_replace (array ('<'   ,'>'),   array ('&lt;','&gt;'),  $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');
13 комментов
Полезные 1 Все