2016-06-26 4 views
1

Ich möchte Interpunktionen und Symbole (nicht Wort Zeichen in der Regel) aus einer Zeichenfolge entfernen, die Unicode (Nicht-ASCII) Zeichen hat.Handle Unicode beim Entfernen/Ersetzen von Nicht-Wort Zeichen

z.B. New $Orléans-New Orléans oder NewOrléans (wenn Raum entfernt wird)

Die Methoden, die ich Kreuz gekommen sind \W oder \w weit so verwenden (siehe PHP strip punctuation)

Die Herausforderung Ich habe Unicode wird beibehalten. Wenn ich \W die Î auf Île-de-France verwenden wird entfernt/ersetzt:

preg_replace('/\W+/', "-", 'Île-de-France')-le-de-France gibt

Ist es möglich, nicht-Wort-Zeichen zu entfernen und noch nicht-ASCII-Zeichen zu verarbeiten, die Wortzeichen sind?

Danke.

+1

Verwenden Sie ''/ [^ \ p {M} \ w] +/u''. –

+2

https://www.regex101.com/r/hV2qA2/1 – splash58

+0

Wenn Sie mit Kombinationsmarken arbeiten müssen, verwenden Sie meinen Vorschlag. Andernfalls ist Ihre Frage ein Duplikat, da es hier so viele ähnliche Fragen zum Modifikator '\ 'gibt. –

Antwort

1

Wenn Sie die sicherste regex müssen Unicode Buchstaben zu handhaben, wenn Nicht-Wortzeichen zu entfernen, verwenden Sie

'/[^\p{M}\w]+/u' 

Siehe regex demo

Der Punkt ist, dass mit allen Mitteln Sie den /u Modifikator benötigen (ermöglicht der PCRE-Engine, das Muster und die Zeichenfolge als Unicode-Zeichenfolge zu behandeln), und \W stimmt nicht mit überein, die Markierungen.

Wenn Sie sich keine Gedanken über die Kombinationsmarkierungen machen müssen, können Sie '/\W+/u' Regex verwenden, um Nicht-Wortzeichen zu entfernen.

Auch sehen die /u modifier reference:

u (PCRE_UTF8)
Dieser Modifikator schaltet zusätzliche Funktionalität von PCRE, die mit Perl nicht kompatibel ist. Pattern- und Subject-Strings werden als UTF-8 behandelt.