Это сводится к регулярному выражению для меня. И прежде чем вы начнете кричать, можно надежно сопоставить и заменить подмножества html, если нет вложенных тегов.
Это самый простой способ. Регулярное выражение для соответствия тега начинается до конца и применяет функцию к соответствию / кодированию того, что нам нужно, и заменяет его.
Вот код:
<?php
$string = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore
magna aliquyam erat, sed diam voluptua.
<code class="highlight sql">
CREATE TABLE `comments`&
</code>
<h1>Next step</h1>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et
dolore magna aliquyam erat, sed diam voluptua.
At vero eos et accusam et justo duo dolores et ea rebum.
<b>Stet clita kasd gubergren&, no sea takimata sanctus</b> est Lorem
dolor sit amet. Lorem ipsum dolor sit amet, consetetur
sadipscing elitr, sed diam nonumy " eirmod " tempor invidunt
ut labore et dolore magna aliq&uyam erat, sed diam voluptua:
<code class="highlight php">
<?php
* $host = "localhost";
?>&
</code>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr.';
echo preg_replace("/(<code[^>]*?>)(.*?)(<\/code>)/se", "
stripslashes('$1').
htmlentities(stripslashes('$2')).
stripslashes('$3')
", $string);
И вот рабочий тестовый пример на кодовой панели
http://codepad.org/MhKwfOQl
Это будет работать до тех пор, пока не появятся неприятные вложенные теги / испорченный html.
Я бы все же посоветовал вам попытаться сохранить данные так, как вы хотите, чтобы они были видны, закодированы, где это необходимо.
Если вы хотите заменить другой набор тегов, измените регулярное выражение.
Обновление: Казалось, что $ host был проанализирован php ... и, конечно, мы этого не хотим. Это произошло из-за того, что php оценивает замещающую строку как php, которая затем выполняет заданные функции и вводит найденные строки в эти функции, и если эта строка инкапсулируется двойными qoutes, она также будет анализировать эти строки ... хех, что за хлопоты.
И тогда возникает другая проблема: php избегает одинарных и двойных qoutes в матчах, поэтому они не будут генерировать ошибки синтаксического анализа, поэтому все qoutes в матчах также должны быть удалены из слешей ... что приводит к довольно долгому заменить строку.