Mit PHP und preg_replace ist das ein 1-Zeiler - als Suchmuster sollte folgendes taugen (nicht getestet) (<![CDATA[)(.*)(]]>), ersetzt wird das mit $1 + htmlspecialchars($2) + $3
Nachtrag (fürs Archiv):
<?php
// Das öffnende und schließnede Tag für den CDATA bereich wollen wir nicht - darum gleich non-capturing parentheses drumherum
// der e-Modifikator sorgt dafür, dass der Code evaluiert wird ([link:http://at2.php.net/preg_replace@title=Beispiel 4], [link:http://at2.php.net/manual/de/reference.pcre.pattern.modifiers.php@title=e (PREG_REPLACE_EVAL)])
$search = '/(?:<!\[CDATA\[)(.*)(?:\]\]>)/e';
// [link:http://at2.php.net/htmlspecialchars@title=htmlspecialchars] sollte für die HTML-Ausgabe passen (ggf. sollte man ENT_QUOTES verwenden)
$replace = 'htmlspecialchars("\\1")';
$string = '<![CDATA[<span class="error">Ich bin ein Beispielcode</span>]]>';
echo preg_replace($search, $replace, $string);
?>