PHP Alle Wörter in einem String markieren

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
711
ich habe in einer Variable mehrere Wörter:
PHP:
$var = 'wort1 wort2 wort3';

außerdem habe ich einen String mit einem Satz:
PHP:
$satz = 'Dies ist wort1 ein Beispiel wort2 Text! bla wort3 bla bla Bla.';

jetzt möchte ich den satz ausgeben und alle wörter die in $var stehen hervorheben, z.B. unterstreichen. Groß und Kleinschreibung ist egal. Wie mache ich das ? ich habe es nur für ein ein einzelnes Wort in $var hinbekommen mit str_ireplace:

PHP:
echo str_ireplace('wort1', '<u>wort1</u>', 'Dies ist wort1 ein Beispiel wort2 Text! bla wort3 bla bla Bla.');
 
Zuletzt bearbeitet:
habe jetzt das:

PHP:
$array = explode(' ', 'wort1 wort2 wort3');
echo str_ireplace($array[0], '<u>'.$array[0].'</u>', str_ireplace($array[1], '<u>'.$array[1].'</u>', str_ireplace($array[2], '<u>'.$array[2].'</u>', 'Dies ist wort1 ein Beispiel wort2 Text! bla wort3 bla bla Bla.')));

geht das auch "schöner" ? jetzt geht es bis 3 wörter nur, müsste ich halt lange copy paste machen.
 
PHP:
$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_replace($search, $replace, $input);

:)
 
  • Gefällt mir
Reaktionen: Pfandfinder
Physikbuddha schrieb:
PHP:
$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_replace($search, $replace, $input);

:)
danke aber auch wenn ich jetzt WoRT1 schreibe soll es unterstrichen sein :) mit str_ireplace geht es zwar, aber im output ist es dann auch "WoRT1" und nicht wort1 wie in $input :/
 
https://www.php.net/manual/en/function.preg-replace.php
Einen Regex mit einer Case-Insensitiven Capturegroup benutzen und dann mit der Capturegroup selbst ersetzen aber ein <u> davor hängen.
Was Regex angeht ist das noch eine der leichtesten Übungen. Die i Flag brauchst du dafür, Capturegroups und wie man die im Replace bei PHP wiederverwendet.


https://www.php.net/manual/en/function.stripos.php
Alternativ kannst du dich manuell durch den String durchwühlen, damit findest du die Position von dem Treffer. Dann kannst du gucken welche Groß und Kleinschreibung der Treffer hat und entsprechend mit str_replace in der alten Schreibweise ersetzen.
 
Joshinator schrieb:
https://www.php.net/manual/en/function.preg-replace.php
Einen Regex mit einer Case-Insensitiven Capturegroup benutzen und dann mit der Capturegroup selbst ersetzen aber ein <u> davor hängen.
Ausser dass der ge-"capture"-te Ausdruck dann da drinsteht?

Variante:
PHP:
[...]
$preg = array_map(fn($s) => "/($s)/i", preg_split('/\s+/', $var));
$psub = array_map(fn($s) => "<u>$s</u>", preg_split('/\s+/', $var));
$sneu = preg_replace($preg, $psub, $satz);

Dies ist <u>wort1</u> ein Beispiel <u>wort2</u> Text! bla <u>wort3</u> bla bla Bla.
 
Zuletzt bearbeitet:
Er weiß ja welche Wörter er mit <u> umschließen will, nur soll die ursprüngliche Groß & Kleinschreibung beibehalten werden.

Wollte extra keinen Code posten, in #3 kann man ja sehen das TE schon beim Array etwas komplett missverstanden hat (oder nicht die verlinkten Docs lesen wollte). Bei sinnlosem Copy&Paste lernt man nicht so viel.

Sowas meine ich
PHP:
$string = 'Dies ist wort1 ein Beispiel wOrT1 Text! bla worT1 bla bla Bla.';
$pattern = '/(wort1)/i';
$replacement = '<u>${1}</u>';
echo preg_replace($pattern, $replacement, $string);

// Dies ist <u>wort1</u> ein Beispiel <u>wOrT1</u> Text! bla <u>worT1</u> bla bla Bla.

Und wie in #2 kann $pattern auch ein Array sein wo man direkt alle Wörter mitgibt die unterstrichen werden sollen.
 
Joshinator schrieb:
Er weiß ja welche Wörter er mit <u> umschließen will, nur soll die ursprüngliche Groß & Kleinschreibung beibehalten werden.
So wie ich das verstanden habe, wollte er die Groß/Kleinschreibung aus dem Muster in den originalen String $Satz übertragen (siehe #5). Das kann ich natürlich auch falsch verstanden haben.
 
Das Problem kann man beliebig komplex aufblasen... Willst du auch Wörter mit dem gleichen Wortstamm hervorheben? Z.B.: Suche nach "Wörter" => "Wort" wird auch hervorgehoben.

Was ich mich frage: Warum willst du das auf dem Server machen? Kannst du doch den Browser und damit den Rechner des Besuchers machen lassen, anstatt dafür Serverlast zu verschwenden:

https://markjs.io/
 
Mit einem vernünftigen Caching-Framework wäre die serverseitige Lösung am Ende je nach Seitentyp schneller, aber bei der Fragestellung bezweifle ich, dass es eins gibt. :cool_alt:
 
  • Gefällt mir
Reaktionen: Pfandfinder
Zurück
Oben