Funktion, um nur alphanumerische Zeichen von der Zeichenfolge zurückzugeben?

98

Ich suche nach einer PHP-Funktion, die eine Eingabezeichenfolge verwendet und eine bereinigte Version davon zurückgibt, indem alle Sonderzeichen entfernt werden, wobei nur alphanumerische Zeichen übrig bleiben.

Ich benötige eine zweite Funktion, die dasselbe tut, aber nur alphabetische Zeichen AZ zurückgibt.

Jede Hilfe sehr geschätzt.

Scott B.
quelle
In welcher Unicode-Normalisierungsform befinden sich diese und warum möchten Sie dies tun?
Tchrist
1
Wenn Sie AZ und 'alphanumerisch' sagen, meinen Sie dann wirklich nur AZ oder möchten Sie alle Buchstaben aus allen Sprachen, einschließlich Fremdsprachen und veralteten Skripten, abgleichen?
Mark Byers
Wenn Sie dies tun, um einen akzentunempfindlichen Zeichenfolgenvergleich durchzuführen, tun Sie das Falsche.
Tchrist
3
Es ist nicht nur "aus allen Sprachen". Es ist Englisch. Englisch verwendet die lateinische Schrift. Es gibt unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192 Codepunkte, die lateinisch alphabetisch sind, aber nicht AZ. Es ist allgemein bekannt, dass ASCII für Englisch ausreicht. Es ist nicht so, und deshalb hat das Schreiben von AZ einen Code-Geruch .
Tchrist
1
@ Scott B: Englisch verwendet nicht nur die 26 Buchstaben von AZ. Zum Beispiel enthält das Wort Lebenslauf é. Vielleicht könnten Sie erklären, was Sie versuchen, da dies Ihnen helfen könnte, bessere Antworten zu erhalten.
Mark Byers

Antworten:

212

Warnung: Beachten Sie, dass Englisch nicht nur auf AZ beschränkt ist.

Versuchen Sie dies , um alles außer az, AZ und 0-9 zu entfernen:

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

Wenn Ihre Definition von alphanumerisch Buchstaben in Fremdsprachen und veraltete Skripte enthält, müssen Sie die Unicode-Zeichenklassen verwenden.

Versuchen Sie dies , um nur AZ zu verlassen:

$result = preg_replace("/[^A-Z]+/", "", $s);

Der Grund für die Warnung ist, dass Wörter wie Lebenslauf den Buchstaben enthalten, mit dem édieser nicht übereinstimmt. Wenn Sie einer bestimmten Buchstabenliste entsprechen möchten, passen Sie den regulären Ausdruck so an, dass er diese Buchstaben enthält. Wenn Sie mit allen Buchstaben übereinstimmen möchten, verwenden Sie die entsprechenden Zeichenklassen, wie in den Kommentaren angegeben.

Mark Byers
quelle
2
Nein, ein alphanumerischer Wert ist [\p{Alphabetic}\p{Numeric}]. Ich habe die alphabetische Eigenschaft PCRE vergessen, aber Sie können sie mit approximieren [\pL\pM\pN].
Tchrist
1
@tchrist: Ich gehe davon aus, dass er, weil er AZ ausdrücklich erwähnt hat, nur dem entsprechen möchte, obwohl ich zugebe, dass die Frage in diesem Punkt viel klarer sein könnte. Ich werde um eine Klarstellung bitten.
Mark Byers
1
@ Mark, ich habe nicht mit dem zweiten Teil Ihrer Antwort gestritten, obwohl es nicht richtig funktioniert, wenn er den String nicht zuerst kanonisch zerlegt hat. Ich habe mit dem ersten Teil gestritten. Außerdem versuche ich immer, Regexe richtig zu machen, die für alle Daten funktionieren , nicht nur für schimmelige alte ASCII. :) Daher ist das Mantra, dass diese Seite des Millenniums manchmal[A-Z] immer falsch ist .
Tchrist
1
@ Mark Byers, ich verstehe .. und ja, ich bevorzuge das, iaber ich muss mich immer nur um eine englische Bevölkerungsgruppe kümmern .. Ich vergesse, dass viele Leute über andere Sprachen nachdenken müssen. Übrigens habe ich gerade bemerkt, dass Sie der Benutzer mit den höchsten Wiederholungszahlen sind, der noch nie eine Frage gestellt hat. Sogar Jon Skeet hat schon früher Fragen gestellt!
JD Isaacks
1
Warum steht am Ende des regulären Ausdrucks ein +? Wäre es nicht ... dasselbe, wenn Sie es entfernen?
Dennis
2

Stattdessen preg_replacekönnten Sie immer die Filterfunktionen von PHP verwenden, indem Sie die filter_var()Funktion mit verwenden FILTER_SANITIZE_STRING.

Mark Baker
quelle
Hat PHP Zugriff auf den ISO Stringprep-Algorithmus? Ich weiß, dass Perl und Java es tun.
Tchrist
Ich glaube, die String-Filter-Funktion funktioniert überwiegend mit 7-Bit-ASCII, aber zitiere mich nicht dazu.
Mark Baker
30
Können Sie uns bitte eine explizite Methode nennen, wie der Benutzer dies tun möchte FILTER_SANITIZE_STRING? Meines Wissens ist das Beste, was auf diese Weise erreicht werden kann, aber es bleiben FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGHnicht nur Buchstaben und Zahlen, sondern auch Punkte, Schrägstriche, Prozente und so weiter.
Pere
$ iMycleanVar = filter_var ($ sStringWithNumbers, FILTER_SANITIZE_NUMBER_INT);
Sultanos
4
Es sieht eher nach einem Kommentar als nach einer Antwort aus. Geben Sie beim Schreiben einer Antwort eine angemessene Erklärung.
Siraj Alam
0
  1. Santize für Zahlen [ 0-9 ] und Alphabete im Allgemeinen [ \ pL ]:
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. Santize speziell für die Alphabete A bis Z (ohne Berücksichtigung der Groß- und Kleinschreibung) [ a-zA-Z ]:
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
Sky7ure
quelle