Mal Eines nach de Anderen...
Die 'Urform' der Funktion substr() sieht so aus
string substr ( string $string
, int $start
[, int $length
] )
daraus machst du
substr($row['inhalt'], strrpos(substr($row['inhalt'], 0, stripos($row['inhalt'], $a3)), " "), 200)
Der grüne Teil... die Startposition... macht irgendwie keinen Sinn! Zumindest erkenne ich den nicht.
Du hast doch einen Startwert - stripos($row['inhalt'], $a3) - das ist doch nur eine Zahl, die du beliebig um 0, 12, 999 oder was auch immer verringern kannst, um die Startposition festzulegen.
Zum anderen Teil der Frage... ja, das verursachst du selbst, indem du ja beim Ersetzen (einfügen der farblichen Markierung) im Einfügestring den originalen Suchstring verwendest!
Um das zu ändern, müsstest du beim Erstellen des Ersatzstrings zunächst das Suchwort in der aktuell genutzten (abweichenden) Schreibweise auslesen.
$true_a3 = substr($row['inhalt'], stripos($row['inhalt'], $a3), strlen($a3));
(hab ich jetzt nicht getestet, sollte aber passen)
Und dann $true_a3 nutzen, um den Ersatzstring zusammenzustellen.