Mit Regulären Ausdrücken kann man zwar wunderbar "positive Treffer" formulieren, aber das Gegenteil davon geht nur sehr schwer (abgesehen von negierten Zeichenklassen und Lookaheads/-behinds geht es nicht). Die Entscheidung, ob ein Treffer innerhalb eines HTML-Tags (also zwischen < und >) liegt oder nicht, muss man von PHP treffen lassen. Hierzu gibt es den Modifier e, der PHP das zweite Argument von preg_replace() als PHP-Code auswerten läßt.
Mit folgender Konstruktion kann man in $t alle Vorkommen von $s außerhalb von < und > durch $r ersetzen; die zweite Version ist besonders mit dem Modifier i interessant, um Wörter unabhängig von ihrer Groß-/Kleinschreibung unter Beibehaltung der Schreibweise hervorzuheben:
// $s in $t durch $r ersetzen: preg_replace("/((<[^>]*)|$s)/e", '"\2"=="\1"? "\1":"$r"', $t); // $s case-insensitive in $t hervorheben: preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<b>\1</b>"', $t);






