Узнать коды некоторых наиболее популярных символов можно в статье «Типографика. Символы первой необходимости», в ней же указано, как узнать код любого нужного символа.
htmlentities()
?Довольное простое решение есть в некоторых учебниках:
$content=preg_replace ("
@<
code.*?>(.*?)
code>@
", htmlentities('$1'), $content);
Здесь $content
хранит строку внутри которой в тэгах <
co
de>
(или с добавлением класса или идентификатора, например <
cod
e clas
s="
show-html">
) встречаются мнемоники (например, &
cop
y;
) и html-коды (например, &
#
16
9;
) спецсимволов. И содержимое тэгов <
co
de>
мы бы хотели показать таким, какое оно введено, без преобразования в соответствующий символ (в нашем случае ©). Функция preg_replace()
здесь отлично подходит. Если мы передали знак ©, то функция его так и выведет. Если мы передали код мнемоники, то функция выведет код мнемоники. Можно посмотреть таблицу преобразований, которую использует функция htmlentities()
, воспользовавшись функцией get_html_translation_table(). Итак, данное решение не подходит. Результат его работы можно посмотреть на странице ex.zaplokee.net/htmlentities.php.
Исходное выражение | Какой получается код после обработки функцией htmlentities() | Что видим в исходном коде страницы | Что видим на странице сайта |
& |
& |
& | |
< | |||
> | |||
© | © | © | © |
Поскольку тэг <
cod
e>
может применяться, чтобы показать php-код, где совершенно не нужен вывод мнемоник, то html-код будем помещать в тэг <
code
ht
ml>
. Без создания класса, чтобы не утонуть в кавычках.
<
cod
e
ht
ml>
, htmlentities()
при выводе на страницу, <
co
de
html>
встречается еще раз, то повторить шаги 1-3. Чтобы посчитать число повторений тэга <
co
de
html>
в строке, воспользуемся функцией substr()
. Пример ее работы можно также посмотреть на ex.zaplokee.net/htmlentities.php.
Чтобы избежать проблемы, когда в $1
лежит спецсимвол и htmlentities('$1')
выводит сам спецсимвол, а не его код, воспользуемся функцией preg_match()
и проверим наличие совпадений.
preg_match("@
<
co
de
html>
(.*?)
code>@"
, $incoming, $matches)>0
То есть мы найдем первое в строке упоминание <
co
de
html>
, возьмем то, что лежит внутри <
co
de
html>
и <
/
cod
e>
и положим в массив $matches
, где нулевой элемент будет хранить целиком найденную подстроку, а первый элемент будет хранить ту часть подстроки, которую мы захватим в подмаску. Массив $matches
в случае использования функции preg_match()
будет одномерным.
В preg_replace()
указываем, что замену надо выполнить единожды:
preg_replace("@
<
co
de
html>
(.*?)<
/
code
>@",
"<
htmlco
de>".$change."<
/
htmlcode>", $incoming, 1)
Здесь $change=htmlentities($matches[1],ENT_QUOTES,'utf-8');
Кодировку указываем, чтобы можно было работать с кириллицей. Флаг ENT_QUOTES
указываем, чтобы и двойные и одинарные кавычки функция преобразовывала в мнемоники, которые на странице сайта будут отображаться соответствующим типом кавычек.