PHP: bestimmte Wörter in String hervorheben?

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.

Woher ich das weiß:Berufserfahrung – Entwickle seit > 20 Jahren Anwendungen mit PHP.
jefodig373 
Fragesteller
 11.08.2021, 18:40

sicherung ?

0
Babelfish  11.08.2021, 19:12
@jefodig373

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
0
Babelfish  12.08.2021, 00:05
@jefodig373

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.
0
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