Замена HTML-символов (< >) на специальные символы при комментировании
В этой статье мы рассмотрим удобный способ вставки кода в текст комментариев на WordPress. Иногда нам нужно будет заменить символы <
и >
на их специальные эквиваленты <
и >
, чтобы избежать их интерпретации браузером как HTML-код. Давайте разберемся, как это сделать.
Задача
Необходимо найти теги <pre>
и <code>
в комментариях и заменить все символы <
и >
внутри них на специальные символы <
и >
.
Важно учитывать, когда именно нужно производить замену. Например, некоторые плагины осуществляют замену во время генерации страницы, т.е. функция преобразования применяется к каждому комментарию каждый раз, когда страница открывается. Однако на практике не встречались плагины, которые бы заменяли эти символы перед записью текста в базу данных. Я считаю, что такой подход был бы наилучшим, так как в случае необходимости замену можно всегда отменить.
Решение задачи (новая версия кода)
Чтобы сделать замену, используйте следующий код. Вставьте его в файл functions.php
вашей темы:
add_filter('pre_comment_content', 'kama_convert_html');
/*
- Преобразует HTML-символы: < > внутри тегов pre, code в специальные символы < и > в тексте
- версия 1.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", "1t", $out ); // заменяем 4 пробела на табуляцию
return "<$matches[1]$matches[2]>$out$matches[1]>";
}
Что делает эта функция?
При публикации комментария функция ищет текст внутри тегов <pre>
и/или <code>
и заменяет символы <
и >
в найденном тексте на <
и >
.
Замена происходит перед тем, как текст комментария будет записан в базу данных. Если нужно сделать замену непосредственно перед отображением текста на экране, замените строку:
add_filter('pre_comment_content', 'kama_convert_html');
// на
add_filter('comment_text', 'kama_convert_html');
Как проверить, что все работает?
После установки функции попробуйте оставить комментарий с таким текстом:
Проверка конвертации символов в комментариях.
Здесь будет код
Первый промежуточный текст
Здесь будет код 2
Промежуточный текст
Здесь будет еще код
Еще один простой текст
Здесь будет код
Наконец, еще текст
В результате в базу данных должен быть записан следующий текст:
Проверка конвертации символов в комментариях.
Здесь будет код <div>
Первый промежуточный текст
Здесь будет код 2 <span>
Промежуточный текст
Здесь будет еще код <div>
Еще один простой текст
Здесь будет код <span>
Наконец, еще текст
Сохранение любого кода в тексте статьи
Тот же подход можно применить и к содержимому статей. Для этого добавьте еще один фильтр в вашу функцию:
add_filter('content_save_pre', 'kama_convert_html');
Старая версия
Старая версия кода функционирует аналогично, но код больше и менее лаконичен:
/ Преобразование HTML-символов < > в специальные символы при отправке комментария /
function kama_html_replace_char_pre( $matches ){
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] );
return "<pre{$matches[1]}>".$out."";
}
function kama_html_replace_char_code ($matches){
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] );
return "<code{$matches[1]}>".$out."";
}
function kama_convert_html ( $comment_text ){ // подготавливает содержимое комментатора
$comment_text = preg_replace_callback ('!<pre([^>])>(?:rn|n|r|)(.?)(?:rn|n|r|)!ims', 'kama_html_replace_char_pre', $comment_text);
$comment_text = preg_replace_callback ('!<code([^>])>(?:rn|n|r|)(.?)(?:rn|n|r|)!ims', 'kama_html_replace_char_code', $comment_text);
return $comment_text;
}
add_filter ('pre_comment_content','kama_convert_html');
Теперь вы знаете, как заменить HTML-символы на специальные в комментариях и статьях! Это позволит вам поддерживать порядок в отображении кода на вашем сайте.