Php - Utf8 - Preg_replace - Sonderzeichen

waYan

Ensign
Registriert
Jan. 2007
Beiträge
156
Hallo,

ich möchte per "preg_replace" sonderzeichen aus einem String entfernen:

$str = preg_replace('/[^\w]/', ' ', $str);

Das funktioniert auch wunderbar, wenn der String in ANSI ist. Ist der String UTF-8 erkennt er Umlaute usw. als Sonderzeichen und schmeisst diese auch raus :(.

Nun habe ich schon folgendes probiert:

setlocale (LC_ALL, 'de_DE.UTF8');
$str = preg_replace('/[^\w]/u', ' ', $str);

Leider erkennt er Umlaute usw. immer noch als Sonderzeichen. Hat jemand vielleicht eine Idee?

thx...

greeTz
waYan
 
Du kannst das Encoding mittels mb_convert_encoding() umwandeln, zum Beispiel so:
PHP:
$str = mb_convert_encoding($str,"ISO-8859-1","UTF-8");
Alternativ müsstest du in deinem regulären Ausdruck "manuell" definieren, welche Zeichen erlaubt sein sollen, und welche nicht.
 
Hallo,

vielen Dank für die Antwort.

Wäre das nicht das gleiche/ähnlich wie:

$str = utf8_decode($str);
$str = preg_replace('/[^\w]/', ' ', $str);
$str = utf8_encode($str);

Das kann es doch aber nicht sein oder?

Ich muss doch dem System sagen können in welchem Zeichensatz ich arbeite "setlocale (LC_ALL, 'de_DE.UTF8');" damit es eben UTF-8 zeichen nicht als Sonderzeichen ansieht.

greeTz
waYan
 
Ja, das käme auf's gleiche raus.

Im Übrigen sagen die PCRE man pages:
In UTF-8 mode, characters with values greater than 128 never match \d, \s, or \w, and always match \D, \S, and \W. This is true even when Unicode character property support is available. These sequences retain their original meanings from before UTF-8 support was available, mainly for efficiency reasons.

Wenn ich das also richtig verstehe, ist dein Problem keine Einschränkung von PHP, sondern wird von den PCRE-Funktionen ansich schon nicht unterstützt.
 
Ja auf gar keinen Fall zu den Zeichensatz konvertieren um zu Ersetzen! Im schlimmsten Fall führt dies dazu, dass bestimmte Sonderzeichen nicht mehr korrekt angezeigt werden, oder umständlich maskiert werden!!
 
Zuletzt bearbeitet:
Hallo,

erstmal vielen Dank für eure Antworten.. thx... :)

@Darii

ja das hatte ich auch schon ausprobiert - benutze ich innerhalb der Regex "\pL" bekomme ich immer folgende PHP Warnung:

Warning: preg_replace() [function.preg-replace]: Compilation failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X

Ich denke also das es diese Character-Klasse (\pL) nicht gibt oder nicht unterstütz wird.

Ich habe aber nun folgendes festgetellt. Es scheint da einen Unterschied zwischen Windows und Linux zu geben:

Ich habe diesen Code unter Windows (XP) und unter Linux (CentOs) ausprobiert:

PHP:
$str = 'abc äöü%§"&ßÄÖÜ abc';
echo 'Original: '. $str.'<BR>';
$str = preg_replace('/[^\w]/u', ' ', $str);
echo 'Ohne Sonderzeichen: '. $str;

Ausgabe unter Windows:

Original: abc äöü%§"&ßÄÖÜ abc
Ohne Sonderzeichen: abc äöü ßÄÖÜ abc

Also alles richtig :)

Ausgabe unter Linix:

Original: abc äöü%§"&ßÄÖÜ abc
Ohne Sonderzeichen: abc abc

Hier werden die Umlaute als Sonderzeichen erkannt und entfernt :(

Wichtig dabei ist, dass es unter Windows nur mit dem Modifier "/u" (switch for Unicode) funktioniert.

Dieser scheint also unter Linux so nicht zu funktionieren :freak:

greeTz
waYan
 
Verwendest du auch die neuste PHP-Version? Bei meiner 5.2.5 geht \pL. Wegen deinem anderen Problem: Das wird vermutlich daran liegen, dass bei deinem CentOS irgendwo die englische Sprache eingestellt ist. Ansonsten Zeichencodierung richtig gesetzt?

Das Problem hättest du mit \pL nicht, das trifft alle Buchstaben, also auch sowas:
Code:
Original: اليابان abc äöü%§"&ßÄÖÜ abc
Ohne Sonderzeichen: اليابان abc äöü    ßÄÖÜ abc
 
Zuletzt bearbeitet:
@Darii

auf welchem OS hast Du "\pL" ausprobiert. Funktioniert bei mir unter Windows XP (PHP 5.2.4) wunderbar - unter CentOs (PHP 5.1.6) wieder nicht :(.

Werde morgen mal mit einem Linux-Admin quatschen... muss doch irgendwie gehen :freak:

greeTz
waYan

Nachtrag:
Ahhh, ich glaube ich weiss warum das nicht geht - auf CentOs ist die mbstring-Erweiterung nicht installiert... werde ich morgen gleich mal testen....
 
Zuletzt bearbeitet:
Hallo,

hier der neuste Stand der Dinge:

Unter CentOs:
mbstring aktiviert
PCRE aktualisiert

geht leider immer noch nicht - macht mich echt kirre. Linux kann einfach nichts mit dem Modifier "/u" oder der Character-Class "\pL" anfangen :(

@Darii
Unter welchem OS funzt das den bei Dir mit "\pL". Etwa unter Linux? Dann wäre es sehr hilfreich mal Deine "phpinfo()" zu sehen. Besonders die Punkte unter mbstring und PCRE.

greeTz
waYan
 
Ich benutze OS X Leopard. Unter Ubuntu Hardy funktioniert es aber auch mit der Standardinstallation von php. Hab mal die phpinfo von Ubuntu sowie die verwendete PHP-Datei angehängt.
 

Anhänge

  • test.txt
    20,9 KB · Aufrufe: 387
  • test.php.txt
    163 Bytes · Aufrufe: 244
Zuletzt bearbeitet:
@Darii

BIG thx.. für die Mühe...

Meine Konfig sieht so aus:

PHP Version 5.1.6
Apache/2.2.3 (CentOS)
--with-pcre-regex=/usr
PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 6.6 06-Feb-2006
Multibyte Support enabled
Multibyte string engine libmbfl
Multibyte (japanese) regex support enabled
Multibyte regex (oniguruma) version 3.7.1
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding no value no value
mbstring.language neutral neutral
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value

Man könnte ja fast meinen, dass es mit der unterschiedlichen PCRE Library Version zu tun hat. Allerdings hat der Modifier /u" eigentlich nichts mit PCRE zu tun sondern ist eher eine Erweiterung. Und mbstring hat eigentlich nur was mit den mb_* Funktionen zu tun.

Hier mal ein Zitat aus der PHP-Doku:
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.

Da müsste man mal den Server updaten - Problem ist blos, dass ich den Sysadmin dazu nicht wirklich bekommen werde, wenn nicht wirklich fest steht, dass das das Problem ist.
(3* das ist ja auch lustig :p)

greeTz
waYan
 
Installiert doch mal bei dir in einer VM eine neuere Version von CentOS(bzw. die derzeit verwendete + neuere PCRE-Version), dann weißt du ob es daran liegt. Alternativ könntest du auch mal nach der Fehlermeldung die du bekommst googlen.
 
@Darii

na das ging ja schnell :)

Wenn ich die Zeit dazu hätte :freak: würde ich das machen. Hoffe immer noch, dass sich das per Forum lösen lässt (Habe das auch noch woanders drin).

Die Fehlermeldung lautet übrigens:

Warning: preg_replace() [function.preg-replace]: Compilation failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X

Findet man aber nicht wirklich was... :(


greeTz
waYan
 
Zuletzt bearbeitet:
Zurück
Oben