php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Simpler Reg Expr -> UTF8 Problem


 
Seikilos
22-11-2008, 18:11 
 
Folgender Code:


$str = "horstöäü";
$res = preg_replace("/[^a-z]/ui","_",$str);


Sollte mir eigentlich "horst___" liefern, denn der Code wurde in einer UTF8 kodierten PHP Datei geschrieben.

Liefert mir aber $res == null.
Nehme ich den u-Modifier weg, so bekomme ich
horst______, da wird jedes char des multibyte utf strings einzeln betrachtet, richtig?

Wie krieg ich dann den Code vernünftig zum laufen?

 
onemorenerd
22-11-2008, 18:21 
 
Bei mir funktioniert es mit /u. Aber so sollte es auch gehen:
$res = preg_replace("/[^a-z]/i", "_", utf8_decode($str));

 
pekka
23-11-2008, 12:19 
 
Original geschrieben von onemorenerd
Bei mir funktioniert es mit /u. Aber so sollte es auch gehen:
$res = preg_replace("/[^a-z]/i", "_", utf8_decode($str));

Das liefert aber fehlerhafte Ergebnisse, wenn andere (nicht dekodierbare) UTF-8-Zeichen in dem String enthalten sind als die, die ersetzt werden, oder?

 
Seikilos
23-11-2008, 12:32 
 
Die Frage ist, diese Daten, wie "Horstöäü"
kommen sonst von einer UTF8-Form vom User in eine UTF-8 Datenbank.

Und im Endeffekt will ich diese Daten escapen, da frage ich mich, wie diese sich in dem Reg Expr verhalten, es macht da kein sinn, irgendwas zu dekodieren, oder? Vor allem, weil pekkas Behauptung zutreffen wird, es werden auch mehr Zeichen auftauchen, die nicht mit decode abgedeckt werden

 
pekka
23-11-2008, 12:44 
 
Dann wirst du wahrscheinlich nicht um die Multibyte-Stringfunktionen drumrumkommen:
http://de.php.net/manual/en/function.mb-ereg-replace.php

 
ezkimo
23-11-2008, 13:17 
 
Da würde ich aber eher mit str_replace arbeiten, bevor ich mir so 'ne langsame Funktion ins Script hole. Die Funktion arbeitet auch mit multibyte Zeichen und ist um einiges schneller als mb_ereg_replace.

 
Seikilos
23-11-2008, 13:24 
 
Also mb_ereg macht auch nicht das, was ich brauche, es ersetzt mir Umlaute, die ich im UTF-8 output problemlos sehe zu �

str_replace wird ein wenig schwierig. So ein Array mit allen möglichen UTF-8 Zeichen ist schon recht groß...

 
pekka
23-11-2008, 13:26 
 
Original geschrieben von Seikilos
Also mb_ereg macht auch nicht das, was ich brauche, es ersetzt mir Umlaute, die ich im UTF-8 output problemlos sehe zu �


Hast Du den Multibyte-Zeichensatz auch auf UTF-8 gesetzt?
Komisch....

 
Seikilos
23-11-2008, 13:28 
 
Note: The internal encoding or the character encoding specified by mb_regex_encoding() will be used as the character encoding for this function.

mb_detect_encoding ist UTF-8, also sollte es utf-8 sein, oder sehe ich das falsch?

Verwirrendes Problem.

 
Seikilos
23-11-2008, 13:42 
 
Hier der Code ausschnitt:

mb_internal_encoding("UTF-8");
$newStr = mb_ereg_replace("/[^a-z]/","_",$str);


Er matcht so etwas wie "Mäyer", aber er ersetzt es mit "M�yer"

Was höcht merkwürdig ist!

preg_match liefer hier immer bei preg_last_error() : PREG_BAD_UTF8_ERROR

 
Seikilos
23-11-2008, 14:25 
 
Ich scheine den Fehler gefunden zu haben.
Ich hatte vorher ein strtolower, was mir degenerierte utf8 kodierung erzeugt hat, was den stillen tod der PCRE zur Folge hatte.

UTF-8 allows for 5 and 6 byte character sequences but these have no meaning in Unicode (ie. there are displayable characters for these sequences). This might lead to “junk” in a web page (browsers would display a ?). See this PHP manual comment - you should filter for 5/6 byte sequences

gut zu wissen, verdammte axt
http://www.phpwact.org/php/i18n/utf-8

So klappt nun auch preg_match


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:29 Uhr.