PHP preg_replace mit Groß-/Kleinschreibung und Umlauten

M

Mr. Snoot

Gast
Hio,

mal wieder ein Umlautproblem :D


Bei der Eingabe von Suchbegriffen, werden Worte vorgeschlagen. Die Buchstaben, die eingetippt wurden, sollen unabhängig von Groß- und Kleinschreibung in den vorgeschlagenen Worten markiert werden. Das klappt im Grunde auch korrekt ...

ok.jpg

... aber nicht, wenn Umlaute enthalten sind. Umlaute werden nur dann korrekt markiert, wenn man sie so eingibt - groß oder klein - wie sie auch im Wort vorkommen. Zudem werden auch alle anderen Buchstaben nicht mehr markiert, sobald ein Umlaut falsch eingegeben wurde.

kaputt.jpg

Der Ausdruck dafür sieht so aus:
PHP:
preg_replace("/($eingabe)/i", "<strong>$1</strong>", $anzeige, 1) // ersetzt $eingabe unabhängig von Groß-/Kleinschreibung (i) in $anzeige, nur 1-mal

Das ist ja schön und blöd; nur wie kann es sein, dass Umlaute nicht korrekt durch <strong>$1</strong> ersetzt werden, obwohl sie dennoch bei der Eingabe erkannt werden? Erkannt werden sie, weil mir ja trotzdem die Worte vorgeschlagen werden, nur die Markierung klappt eben nicht :confused_alt:


Mit $eingabe passiert vor der Ersetzung eigentlich nichts Großartiges:
PHP:
  $eingabe  = $_POST["eingabe"];        //Suchbegriff
  $eingabe = preg_quote($eingabe);      //Verhindert fehlerhafte Zeicheninterpretation in preg_replace (Zeile 22 und 31)
  $eingabe = htmlspecialchars($eingabe);

  mysql_query("SET NAMES 'utf8'"); # Umlaute korrekt verarbeiten

  if (get_magic_quotes_gpc()) $eingabe = stripslashes($eingabe);

  $sql = sprintf("SELECT ... FROM ... WHERE ... LIKE '%s%%';", mysql_real_escape_string($eingabe));
  $begriff = mysql_query($sql);
  while ($antwort=mysql_fetch_array($begriff))
  {
    $anzeige_fett = preg_replace("/($eingabe)/i", "<strong>$1</strong>", $anzeige, 1)
    ...
  }
Ich hab die Befehle davor auch schon testweise mal alle auskommentiert, aber es hat sich nichts geändert.
 
Zuletzt bearbeitet:
Ja, jetzt eben :D

Ändert aber leider nichts. utf8_decode davor und utf8_encode danach zeigen auch keine wirkung; danach werden nicht mal mehr richtige Umlaute ersetzt.


edit: scheint so, als sei der Modifier u des Rätsels Lösung; aber ich freu mich mal nicht zu früh - irgendwo wird das sicher wieder zu Problemen führen :D

Interessant ist dennoch, warum die Worte in jedem Fall gefunden werden aber die Ersetzung nicht klappt.
 
Zuletzt bearbeitet:
Der Midifier u wirkt sich auch nur auf den Punkt aus.
Sollte also eigentlich keine Änderung in deinem Skript bewirken.
 
Hab jetzt aber paar Webseiten gefunden, wo das als Lösung genannt wird; und bisher klappts anscheind auch.

Es scheint generell ein UTF8-Problem zu sein
u (PCRE_UTF8)
Dieser Modifikator schaltet mit Perl nicht kompatible zusätzliche PCRE-Funktionalität an. Suchmuster werden als UTF-8 behandelt. Dieser Modifikator steht unter Unix seit PHP 4.1.0 und unter Win32 seit PHP 4.2.3 zur Verfügung. Ob es sich im Suchmuster um gültiges UTF-8 handelt, wird seit PHP 4.3.5 überprüft.
 
Zurück
Oben