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
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.
Kategorie: PHP + MySQL. Tagi: #wordpress, #kolorowanie kodu, #prism, #formatowanie, #encje, #zmiana znaków, #code, #pre. Źródło obrazków: Pixabay, Font awesome.