php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Umlaute und Regulärer Ausdruck


 
itsmejake
02-02-2009, 16:46 
 
Hallo,
kann mit jemand erklären, warum das hier nicht funktioniert:

preg_match('/^(über |über: )/u',utf8_encode($value))

Es soll damit überprüft werden, ob am anfang des strings das wort "über" steht. Aber es gibt probleme mit dem Umlaut "ü". Damit die Überprüfung auf Umlaute funktioniert soll das ganze utf8 codiert sein. Aber irgendwie gibt es da probleme:

Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 3

hat jemand einen Ausweg parat?
Danke!

 
PHP-Desaster
02-02-2009, 18:14 
 
Deine Datei ist kein UTF-8. Entweder diesen Missstand ändern oder die Unicode-Zeichen über die Hexadezimalschreibweise angeben.

 
fireweasel
02-02-2009, 20:50 
 
Original geschrieben von itsmejake
Hallo,
kann mit jemand erklären, warum das hier nicht funktioniert:

preg_match('/^(über |über: )/u',utf8_encode($value))


Das geht effektiver (sprich: schneller):

preg_match('/^über:? /u', utf8_encode($value));


Es soll damit überprüft werden, ob am anfang des strings das wort "über" steht. Aber es gibt probleme mit dem Umlaut "ü". Damit die Überprüfung auf Umlaute funktioniert soll das ganze utf8 codiert sein.
Warum? Du wandelst den zu durchsuchenden String erst von ISO-Latin-1 in UTF-8, um ihn dann zu durchsuchen. Das ist umständlich. Du solltest die UTF-8-Funktionalität der PCRE-Befehle benutzen, wenn sie auch wirklich benötigt wird. So lange dein $value aber ISO-LATIN-1 enthält (oder eine andere 8-Bit-Kodierung), ist das unnötig. Daher genügt:

preg_match('/^über:? /', $value);

Das ist schneller und geht mit dem Hauptspeicher sparsamer um.

Aber irgendwie gibt es da probleme:

Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 3
Auf "Offset 3" steht dein "ü". Also ist höchstwahrscheinlich deine Quelltext-Datei nicht UTF-8-kodiert. (http://de3.php.net/manual/de/reference.pcre.pattern.modifiers.php#54805) Das kannst du bspw. mit einem Hex-Viewer/-Editor prüfen -- dann müsste das "ü" nämlich aus zwei Bytes bestehen.

Wenn du dem Rat von PHP-Desaster folgst, dann denke daran, dass UTF-Zeichen in PCRE so kodiert werden:

preg_match('/^\x{0fc}ber:? /u', utf8_encode($value));

 
itsmejake
03-02-2009, 16:42 
 
Hallo und Danke für die Antworten! Leider funktioniert weder:

preg_match('/^über:? /', $value);

noch

preg_match('/^x{0fc}ber:? /u', utf8_encode($value));

jetzt gibt es zwar keine Fehlermeldung mehr aber der findet das "über:" einfach nicht?!?!? ergebnis ist immer "0"???

Wie sucht Ihr in einem String nach dem wort "über", so dass man auch an diesem Schlüsselwort splitten kann mit preg_split?

Das muss doch möglich sein??? ich bin verzweifelt!;-(

 
wahsaga
03-02-2009, 16:57 
 
Original geschrieben von itsmejake
Wie sucht Ihr in einem String nach dem wort "über", so dass man auch an diesem Schlüsselwort splitten kann mit preg_split?
Ganz einfach - in dem ich beides (String, und Script welches den RegEx enthaelt) in der gleichen Zeichenkodierung abspeichere, so dass ich nicht Aepfel mit Birnen vergleiche, was du offenbar tust.

 
itsmejake
03-02-2009, 17:06 
 
Kannst du mir auf die Sprünge helfen?

Das klingt logisch - hab aber keinen Ansatz.

Der String kommt aus einem Formular übergeben. Wenn ich ihn innerhalb des scripts deklariere funktioniert es aber eben nicht über das Formular:

$value="über:asdfgasdfkjgsdfkjgas";

(hier funktioniert es)


Thx!

 
wahsaga
03-02-2009, 17:17 
 
Und das Formular befindet sich in einem Dokument, welches mit der gleichen Zeichenkodierung gesendet und angezeigt wird?

Hat es irgendeine accept-charset-Angabe? (Sollte, wenn man konsequent und durchgehend eine Kodierung verwendet, eigentlich nicht noetig sein.)

 
itsmejake
03-02-2009, 17:24 
 
JAu!

Habs nochmal überprüft. Aus irgendeinem Grund war die eine Datei als ANSI und die Andere utf-8 codiert!?!?!?

Wär aber nie drauf gekommen, dass das solch einen Fehler verursachen könnte!

DANKE!

 
pekka
03-02-2009, 17:35 
 
Schau dir die Kodierung an, in der die Seite gehalten ist, in der das Formular steht.


Ah schon erledigt.


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:16 Uhr.