Jak zmienić znaki specjalne na encje pomiędzy znacznikiem PRE (również w WordPressie)?

Data aktualizacji: 22.04.2024r. Autor: Bartosz Stefanicki.

Jak zmienić znaki specjalne na encje pomiędzy znacznikiem PRE (również w WordPressie)?

Potrzebowałem kodu, który zmieni znaki specjalne typu "<" i ">" na encje, aby finalnie w przeglądarce kod wyświetlał się bezbłędnie. Jak to zrobiłem?

Instrukcja dla strony internetowej

Najlepiej chyba od razu pokazać kod:

<?php
$str = 'Tutaj kod ze znacznikiem pre, który chcemy zmienić';
$pattern = '~<pre[^>]*>\K.*(?=</pre>)~Uis';
$str = preg_replace_callback($pattern, function ($m) {
         return str_replace("<", "<", $m[0]);
       }, $str);
echo $str;
?>

W pierwszej linijce tworzymy zmienną $str, a jako wartość podajemy kod, który chcemy skonwertować.

W drugiej linijce definiujemy wyrażenie, które sprawia że znaki będą zmienione wyłącznie pomiędzy znacznikiem <pre> i </pre>.

W trzeciej linijce aż do końca krótko mówiąc zamieniamy - w tym przypadku - jeden znak "<", przy czym to wystarczy by przeglądarka nie odczytała tego kodu jako elementu strony internetowej.

Instrukcja dla WordPressa

Jak zmienić znaki specjalne na encje pomiędzy znacznikiem PRE (również w WordPressie)?

Sprawdźmy teraz jak to zrobić w przypadku WordPressa. Tutaj sprawa przez chwilę była bardziej skomplikowana, ponieważ funkcji która wyświetla treść posta the_content() nie można przypisać do zmiennej. Z drugiej strony funkcję get_the_content() można przypisać do zmiennej, natomiast nie zawiera formatowania tekstu.

Udało się to jednak rozwiązać poniższym kodem:

<?php
function get_the_content_with_formatting ($more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
	$content = get_the_content($more_link_text, $stripteaser, $more_file);
	$content = apply_filters('the_content', $content);
	$content = str_replace(']]>', ']]>', $content);
	return $content;
}

$str = get_the_content_with_formatting();
$pattern = '~<code[^>]*>\K.*(?=</code>)~Uis';
$str = preg_replace_callback($pattern, function ($m) {
         return str_replace("<", "<", $m[0]);
       }, $str);
echo $str;
?>

W powyższym kodzie wykorzystujemy rozwiązanie znalezione na forum WordPressa i łączymy je z omówionym wcześniej kodem. Tutaj zaszła jeszcze jedna zmiana - kod będzie zmieniony ale nie pomiędzy znacznikiem <pre> a pomiędzy znacznikiem <code>.

Dlaczego? Ponieważ w WordPressie wykorzystałem kolorowanie składni kodu za pomocą Prism.

Zobacz także

Komentarze