it-swarm.com.de

Wie entferne ich nicht alphanumerische Zeichen?

Ich muss alle Zeichen aus einer Zeichenfolge entfernen, die nicht in a-z A-Z 0-9 gesetzt sind oder keine Leerzeichen sind.

Hat jemand eine Funktion, um dies zu tun?

298
zuk1

Klingt, als wüssten Sie schon fast, was Sie schon machen wollten, Sie haben es im Grunde als Regex definiert.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);
618
Chad Birch

Für Unicode-Zeichen gilt:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
146
voondo

Regulärer Ausdruck ist deine Antwort. 

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • i steht für Groß- und Kleinschreibung. 
  • ^ bedeutet, beginnt nicht mit. 
  • \d entspricht einer beliebigen Ziffer. 
  • a-z stimmt mit allen Zeichen zwischen a und z überein. Aufgrund des Parameters i müssen Sie nicht a-z und A-Z angeben. 
  • Nach \d gibt es ein Leerzeichen, so dass Leerzeichen in dieser Regex zulässig sind.
44
raspi

hier ist eine wirklich einfache Regex dafür:

\W|_

und wird verwendet, wenn Sie es benötigen (mit einem Schrägstrichbegrenzer für /).

preg_replace("/\W|_/", '', $string);

Testen Sie es hier mit diesem großartigen Tool, das erklärt, was der Regex tut:

http://www.regexr.com/

16
Alex Stephens
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

Es werden alle nicht von A-Z, a-z, 0-9 ausgewählt und gelöscht.

Beispiel siehe hier: https://regexr.com/3h1rj

4
Intacto
preg_replace("/\W+/", '', $string)

Sie können es hier testen: http://regexr.com/

2
DOZ

Wenn Sie andere Sprachen als die üblichen A-Z-Sprachen unterstützen müssen, können Sie Folgendes verwenden:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ] definiert ein negated (es entspricht einem Zeichen, das nicht definiert ist) Zeichenklasse von:
    • \p{L}: ein Brief aus der Sprache any.
    • \p{N}: ein numerisches Zeichen in any -Skript.
    • : ein Leerzeichen.
  • +gierig entspricht der Zeichenklasse zwischen 1 und unbegrenzt mal.

Dadurch bleiben Buchstaben und Zahlen aus anderen Sprachen und Skripten sowie von A-Z erhalten:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', '[email protected]~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界[email protected]£$%^&*()'); // 你好世界

Hinweis: Dies ist eine sehr alte, aber dennoch relevante Frage. Ich antworte lediglich, um zusätzliche Informationen bereitzustellen, die für zukünftige Besucher nützlich sein können.

2
Jonathon

Ich suchte auch nach der Antwort und meine Absicht war es, jedes Nicht-Alpha zu bereinigen, und es sollte nicht mehr als ein Leerzeichen geben.
Also habe ich Alex 'Antwort darauf geändert und das funktioniert für mich preg_replace('/[^a-z|\s+]+/i', ' ', $name)
Der Regex oben hat sy8ed sirajul7_islam bis sy ed sirajul islam
Erläuterung: Regex prüft NOT ANY von a bis z, falls nempfindlich oder mehr als ein Leerzeichen, und es wird in ein einzelnes Leerzeichen konvertiert .

0
ssi-anik

Sie können die Zeichenfolge in Zeichen aufteilen und filtern.

<?php 

function filter_alphanum($string) {
    $characters = str_split($string);
    $alphaNumeric = array_filter($characters,"ctype_alnum");
    return join($alphaNumeric);
}

$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123

?>
0
zekel