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