2016-06-24 18 views
3

Hallo i unten Code versucht, mit regexPHP: wie spezielle Zeichen zu entfernen (außer etwas) von String

$str = preg_replace("/[^a-z0-9_]/i", '', 'New_text % *'); 

//output => New_text 

(_ ist außer char)

alle arbeiten perfekt, aber wenn mein Eingabestring so etwas wie in anderer Sprache (ex Hindi) wird Char in Hindi Lang auch löschen.

wie oben Beispiel

$str = preg_replace("/[^a-z0-9_]/i", '', 'कपिल शर्मा % * _'); 

//output => _ 

how to get: कपिल शर्मा _ 

gibt es einen Fehler in regex oder irgendeine andere Art und Weise in PHP wir tun können?

+3

Verwenden Sie '\ W' anstelle des vollständigen Zeichenbereichs. Fügen Sie auch den Modifikator "u" hinzu. – chris85

+0

Das 'a-z' deckt nicht Hindi Buchstaben sollten offensichtlich sein ... das sind _Latin_ Buchstaben. – CBroe

+0

Also, was genau * tust du dann zu? 'a-z0-9' ist einfach und spezifisch. * "Und auch Hindi" * ist sehr weit, vage und unspezifisch. Was ist mit Arabisch, Japanisch und anderen Sprachen? – deceze

Antwort

2

Sie verwenden müssen, verwenden können

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

Siehe regex demo

Es scheint, dass PHP PCRE regex nicht mit Marken mit \W und /u Modifikator kombiniert, so müssen wir die entsprechenden [^\w] negierte Zeichenklasse verwenden und eine \p{M} Unicode Eigenschaft hinzufügen (Marken kombinieren).

Siehe more on Unicode properties here.

+0

Danke Wiktor Stribiżew – user3736833

2

Verwenden Unicode-Eigenschaften:

$str = preg_replace("/[^\p{L}\p{N}\p{Z}_]/u", '', 'कपिल शर्मा % * _'); 

Wo

  • \p{L} steht für jeden Buchstaben in jeder Sprache
  • \p{N} steht für jede Ziffer in jeder Sprache
  • \p{Z} steht für jede Art von Separator.
  • u Flagge für Unicode

Documentation

+0

es gibt mir Warnung: preg_replace(): Kompilierung fehlgeschlagen: unbekannter Name der Eigenschaft nach \ P oder \ p – user3736833

+0

gib mir keine korrekte Ausgabe: 0कपलशम_ – user3736833

+0

@ user3736833: Leerzeichen in der Zeichenklasse hinzufügen, siehe meine Bearbeitung. – Toto

0

Sie filter_var

filter_var('your string &% * _',FILTER_SANITIZE_STRING | FILTER_FLAG_STRIP_HIGH); 

oder wenn Sie Symbol Smal können Sie verwenden können str_replace

$arrayRequer = array('*','_','^','%'); 
str_replace($arrayRequer,'',$yourString); 
+0

Wenn Sie auf 'downvote' klicken können, bitte haben Sie keine Angst sagen Sie mir warum? – Naumov

+0

Nur weil niemand erklärt warum, werde ich es wiedergutmachen. Ich habe heute [einen ähnlichen Downvote] (http://stackoverflow.com/a/38012656/3832970). Selbst für eine perfekt funktionierende und gut erklärte Antwort. Das ist nicht das, was SO sein muss: Downvoting, weil du nicht magst * etwas ist definitiv böse. –