PHP: bestimmte Wörter in String hervorheben?
ich möchte in PHP bestimmte Wörter aus einem Text hervorheben. bis jetzt habe ich das hinbekommen :
$searchStr = 'WoRt1 wort2 WORT3';
$search = explode(' ', $searchStr);
$replace = array_map(fn($str) => "<u>$str</u>", $search);
$input = 'Dies ist wort1 ein Beispiel wort2 Text! bla wort3 bla bla Bla.';
$output = str_ireplace($search, $replace, $input);
echo $output;
Die wörter in $searchStr können aber unterschiedlich von der Groß und Kleinschreibung sein. "Problem" ist jetzt aber dass in $output diese groß- und Kleinschreibung ausgegeben wird, und nicht die originale aus $input. also erhalte ich "Dies ist WoRt1..." anstatt "Dies ist wort1...".
Wie bekomme ich das hin dass die unterstrichenen Wörter original aus $input verwendet werden ?
3 Antworten
Mit einem regulären Ausdruck lässt sich das machen. Hier ein vereinfachtes Beispiel:
$searchStr = 'WoRt1 wort2 WORT3';
$search = explode(' ', $searchStr);
$input = 'Dies ist wort1 ein Beispiel Wort2 Text! bla wort3 bla bla Bla.';
$output = preg_replace('/('.implode('|', $search).')/i', '<u>$1</u>', $input);
echo $output;
// Dies ist <u>wort1</u> ein Beispiel <u>Wort2</u> Text! bla <u>wort3</u> bla bla Bla.
Du musst da dann natürlich noch ein Sicherungen einbauen aber generell ist das ein relativ einfacher Weg.
Na ja, dein $searchStr muss zum Beispiel überprüft werden, damit da kein / oder | drin sind und diese Zeichen entweder gelöscht oder mit \ escaped werden.
Dann kann man je nach Anforderung auch noch Wortgrenzen beachten:
$output = preg_replace('/(\b'.implode('\b|\b', $search).'\b)/i', '<u>$1</u>', $input);
// aus wort1bla wird nicht <u>wort1</u>bla
also damit wird es immer noch <u>wort1</u>bla
kann man noch machen dass wort1-bla geht ?
Also aktuell geht das zumindest schon so weit, dass in wort1-bla der Teil wort1 unterstrichen wird.
Wenn du aber direkt nach wort1-bla suchen willst, solltest du vor der Suche das Sucharray absteigend nach der Länge der Suchwörter sortieren. Dann werden erste die längsten Wörter gefunden und die kürzeren funken da nicht mehr dazwischen:
$searchStr = 'WoRt1 wort wort2 WORT3 wort1-bla';
$search = explode(' ', $searchStr);
usort($search, fn($a, $b) => strlen($a) < strlen($b));
$input = 'Dies ist wort1 wort1e wort1-bla ein Beispiel Wort2 Text! WORT bla wort3 Bla.';
$output = preg_replace('/(\b'.implode('\b|\b', $search).'\b)/i', '<u>$1</u>', $input);
echo $output;
// Dies ist <u>wort1</u> wort1e <u>wort1-bla</u> ein Beispiel <u>Wort2</u> Text! <u>WORT</u> bla <u>wort3</u> Bla.
Wie bekomme ich das hin dass die unterstrichenen Wörter original aus $input verwendet werden ?
Mit Hilfe einer der Funktionen
- strtolower()
- strtoupper()
bringst Du needle und haystack in die gleiche Schreibweise und kannst dann 1:1 vergleichen.
Alex
Lass dir die positionen über den index ausgeben mit
array_keys():
und hole es dir dann danach selbst aus dem string
sicherung ?