1. #1
    Cadet 4th Year
    Dabei seit
    Jan 2007
    Beiträge
    115

    Question Php - Utf8 - Preg_replace - Sonderzeichen

    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

  2. Anzeige
    Logge dich ein, um diese Anzeige nicht zu sehen.
  3. #2
    Cadet 4th Year
    Dabei seit
    Apr 2004
    Beiträge
    64

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    Du kannst das Encoding mittels mb_convert_encoding() umwandeln, zum Beispiel so:
    Code [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.

  4. #3
    Cadet 4th Year
    Ersteller dieses Themas

    Dabei seit
    Jan 2007
    Beiträge
    115

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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

  5. #4
    Cadet 4th Year
    Dabei seit
    Apr 2004
    Beiträge
    64

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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.

  6. #5
    Lt. Commander
    Dabei seit
    Jan 2008
    Ort
    /home
    Beiträge
    1.533

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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!!

  7. #6
    Lt. Junior Grade
    Dabei seit
    Aug 2004
    Beiträge
    486

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    Zitat Zitat von waYan Beitrag anzeigen
    $str = utf8_decode($str);
    $str = preg_replace('/[^\w]/', ' ', $str);
    $str = utf8_encode($str);

    Das kann es doch aber nicht sein oder?
    Richtig. Versuch es mal mit

    Code [php]:
    $str = preg_replace('/[^\pL]/u', ' ', $str);
    Kann sein, dass damit zu viel getroffen wird, muss du mal rumprobieren.

    Siehe auch: http://de2.php.net/manual/en/functio...atch.php#68974
    Geändert von Darii (23.04.2008 um 10:50 Uhr)

  8. #7
    Cadet 4th Year
    Ersteller dieses Themas

    Dabei seit
    Jan 2007
    Beiträge
    115

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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:

    Code [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

    greeTz
    waYan

  9. #8
    Lt. Junior Grade
    Dabei seit
    Aug 2004
    Beiträge
    486

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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
    Geändert von Darii (23.04.2008 um 20:37 Uhr)

  10. #9
    Cadet 4th Year
    Ersteller dieses Themas

    Dabei seit
    Jan 2007
    Beiträge
    115

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    @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

    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....
    Geändert von waYan (23.04.2008 um 22:57 Uhr)

  11. #10
    Cadet 4th Year
    Ersteller dieses Themas

    Dabei seit
    Jan 2007
    Beiträge
    115

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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

  12. #11
    Lt. Junior Grade
    Dabei seit
    Aug 2004
    Beiträge
    486

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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.
    Angehängte Dateien Angehängte Dateien
    Geändert von Darii (30.04.2008 um 13:46 Uhr)

  13. #12
    Cadet 4th Year
    Ersteller dieses Themas

    Dabei seit
    Jan 2007
    Beiträge
    115

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    @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 )

    greeTz
    waYan

  14. #13
    Lt. Junior Grade
    Dabei seit
    Aug 2004
    Beiträge
    486

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    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.

  15. #14
    Cadet 4th Year
    Ersteller dieses Themas

    Dabei seit
    Jan 2007
    Beiträge
    115

    AW: Php - Utf8 - Preg_replace - Sonderzeichen

    @Darii

    na das ging ja schnell

    Wenn ich die Zeit dazu hätte 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
    Geändert von waYan (30.04.2008 um 14:58 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •