Wie entferne ich nicht alphanumerische Zeichen?

349

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

Hat jemand eine Funktion, um dies zu tun?

zuk1
quelle

Antworten:

695

Klingt so, als hätten Sie fast gewusst, was Sie bereits tun wollten. Sie haben es im Grunde genommen als regulären Ausdruck definiert.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);
Chad Birch
quelle
8
zuk1: regexbuddy ist eine große Hilfe dabei
Relipse
2
Hier ist ein Beispiel, wenn Sie den Bindestrich als zulässiges Zeichen einfügen möchten. Ich brauchte dies, weil ich unzulässige Zeichen aus einem Moodle-Benutzernamen entfernen musste, basierend auf E-Mail-Adressen: preg_replace ("/ [^ a-z0-9 _. @ \ -] /", '', $ string);
Evan Donovan
2
Würde dies mit Apostrophen (einfache Anführungszeichen) um den regulären Ausdruck anstelle von Anführungszeichen (doppelte Anführungszeichen) genauso funktionieren? ZB:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625
3
Wir wollen eine Erklärung dazu :). Die Leute kommen hierher, um zu sehen, warum es so ist, wie es ist. Bitte beachten Sie auch die Regex-Erklärung! Danke
Pratik
1
Was ist, wenn wir akzentuierte Zeichen behalten möchten?
Wonzbak
169

Für Unicode-Zeichen gilt Folgendes:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
voondo
quelle
Hallo Voondo, was ist mit dem / ui-Ding? Wie nennt man das? Kann mir bitte jemand etwas Licht ins Dunkel bringen? Vielen Dank.
Kebyang
4
Zur Verdeutlichung werden sie Flaggen genannt. Sie werden nach dem schließenden Trennzeichen gesetzt (in diesem Fall ist es "/", aber es kann "~" oder "@" sein oder ein beliebiges Zeichen, das Sie verwenden möchten, solange die öffnenden und schließenden Trennzeichen gleich sind) und ändern das Verhalten des Ausdrucks.
Doktor J
1
Übrigens \wbeinhaltet \dund so \dist das unnötig. Dies ist auch falsch, da dadurch auch Unterstriche in der resultierenden Zeichenfolge (die auch in enthalten ist \w) verbleiben.
Smathy
2
Es gibt immer noch einen Fehler, die Zeichenklassen müssen mit ':]' abgeschlossen werden, damit die richtige Zeile lautet: preg_replace ("/ [^ [: alnum:] [: space:]] / ui", '', $ string);
h00ligan
4
Ist die iFlagge hier wirklich notwendig, da [:alnum:]bereits beide Fälle abgedeckt sind?
Billynoah
50

Regulärer Ausdruck ist Ihre Antwort.

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • Das isteht für Groß- und Kleinschreibung.
  • ^ bedeutet, beginnt nicht mit.
  • \d stimmt mit einer beliebigen Ziffer überein.
  • a-zstimmt mit allen Zeichen zwischen aund überein z. Wegen der iParameter Sie müssen nicht angeben a-zund A-Z.
  • Nachdem \dein Leerzeichen vorhanden ist, sind in diesem regulären Ausdruck Leerzeichen zulässig.
Raspi
quelle
3
Wir wollen eine Erklärung dazu :). Die Leute kommen hierher, um zu sehen, warum es so ist, wie es ist. Bitte beachten Sie auch die Regex-Erklärung! Nicht jeder ist weit genug fortgeschritten, um zu wissen, was Sie dort ohne Erklärung geschrieben haben. Danke
Pratik
@PratikCJoshi Das i steht für Groß- und Kleinschreibung. ^ bedeutet, beginnt nicht mit. \ d entspricht einer beliebigen Ziffer. az entspricht allen Zeichen zwischen a und z. Aufgrund des i-Parameters müssen Sie nicht az und AZ angeben. Nach \ d gibt es ein Leerzeichen, daher sind Leerzeichen in dieser Regex zulässig.
Bart
1
Die Leute lesen keine Kommentare als Antwort. Bitte Antwort aktualisieren!
Pratik
18

Hier ist eine wirklich einfache Regex dafür:

\W|_

und nach Bedarf verwendet (mit einem /Schrägstrichbegrenzer).

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

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

http://www.regexr.com/

Alex Stephens
quelle
1
Sie benötigen weiterhin die /uFlagge, da sonst auch Nicht-ASCII-Buchstaben entfernt werden.
Xeoncross
Ordentlich , würde aber auch mit Leerzeichen übereinstimmen und wenn dies gewünscht wird, könnte wahrscheinlich die Leistung durch Verwendung einer Zeichenklasse und eines zusätzlichen Quantifizierers für eine oder mehrere [\W_]+
Bobble Bubble
18

Wenn Sie anstelle der typischen AZ andere Sprachen unterstützen müssen, können Sie Folgendes verwenden:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]definiert eine negierte Zeichenklasse (sie entspricht einem nicht definierten Zeichen) von:
    • \p{L}: ein Brief aus einer beliebigen Sprache.
    • \p{N}: ein numerisches Zeichen in einem beliebigen Skript.
    • : ein Leerzeichen.
  • + Gierig passt die Charakterklasse zwischen 1 und unbegrenzt oft.

Dadurch bleiben Buchstaben und Zahlen aus anderen Sprachen und Skripten sowie aus AZ erhalten:

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

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

Jonathon
quelle
8
[\W_]+

 

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

Es werden alle nicht AZ, az, 0-9 ausgewählt und gelöscht.

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

Intacto
quelle
1
Was bedeutet dieser reguläre Ausdruck / [\ W _] + / u?
Angelo Rigo
\Wist die Umkehrung \wdavon sind Zeichen A-Za-z0-9_. Also \Wwird jeder Charakter, der nicht ist, übereinstimmen A-Za-z0-9_und sie entfernen. Das []ist eine Zeichensatzgrenze . Das +ist an einer Zeichensatzgrenze redundant, bedeutet aber normalerweise 1 oder mehr Zeichen. Das uFlag erweitert den Ausdruck um die Unterstützung von Unicode-Zeichen, dh, es werden keine Zeichen entfernt, die über den Zeichencode 255 hinausgehen, z ª²³µ. Beispiel für verschiedene Verwendungen 3v4l.org/hSVV5 mit Unicode- und ASCII-Zeichen.
Fyrye
2
preg_replace("/\W+/", '', $string)

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

TOZ
quelle
Laut der Antwort von @Alex Stevens werden die Unterstriche "_" nicht abgefangen.
Ariel Allon
0

Ich suchte auch nach der Antwort und wollte jedes Nicht-Alpha 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 obige reguläre Ausdruck wurde sy8ed sirajul7_islamzu sy ed sirajul islam
Erläuterung: Der reguläre Ausdruck überprüft KEINEN von a bis z, falls er unempfindlich ist oder mehr als ein Leerzeichen enthält, und wird in einen einzelnen konvertiert Platz.

ssi-anik
quelle
-2

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

?>
zekel
quelle
Grund für die Ablehnung: 3v4l.org/fqLVZ Darüber hinaus erscheint das Aufrufen von (3 + N) -Funktionen für eine Zeichenfolge unbekannter Länge im Vergleich zu einem einzelnen und einfachen preg_replace()Aufruf wirklich unattraktiv .
Mickmackusa