Funzione per restituire solo caratteri alfanumerici dalla stringa?


100

Sto cercando una funzione php che prenda una stringa di input e restituisca una versione disinfettata di essa eliminando tutti i caratteri speciali lasciando solo alfanumerici.

Ho bisogno di una seconda funzione che faccia lo stesso ma restituisca solo caratteri alfabetici AZ.

Qualsiasi aiuto molto apprezzato.


In quale modulo di normalizzazione Unicode si trovano questi e perché vorresti farlo?
tchrist

1
Quando dici AZ e "alfanumerico", intendi davvero solo AZ o vuoi abbinare tutte le lettere di tutte le lingue, comprese le lingue straniere e gli script obsoleti?
Mark Byers

Se lo fai in modo da poter eseguire un confronto tra stringhe senza accento, stai facendo la cosa sbagliata.
tchrist

3
E ' non solo “da tutte le lingue”. È inglese. L'inglese usa l'alfabeto latino. Ci sono unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192 punti di codice che sono alfabetici latini ma che non sono AZ. È opinione diffusa che ASCII sia sufficiente per l'inglese. Non lo è, ed è per questo che scrivere AZ ha un odore di codice .
tchrist

1
@ Scott B: l'inglese non usa solo le 26 lettere dalla A alla Z. Ad esempio, la parola curriculum include é. Forse potresti spiegare cosa stai cercando di fare in quanto ciò potrebbe aiutarti a ottenere risposte migliori.
Mark Byers

Risposte:


216

Avvertenza: tieni presente che l'inglese non è limitato alla sola AZ.

Prova questo per rimuovere tutto tranne az, AZ e 0-9:

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

Se la tua definizione di alfanumerico include lettere in lingue straniere e script obsoleti, dovrai utilizzare le classi di caratteri Unicode.

Prova questo per lasciare solo AZ:

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

Il motivo dell'avvertimento è che parole come curriculum contengono la lettera éche non troverà corrispondenza con questo. Se desideri trovare una corrispondenza con un elenco specifico di lettere, regola l'espressione regolare per includere quelle lettere. Se vuoi abbinare tutte le lettere, usa le classi di caratteri appropriate come menzionato nei commenti.


2
No, un alfanumerico è [\p{Alphabetic}\p{Numeric}]. Ho dimenticato la proprietà alfabetica PCRE, ma puoi approssimarla con [\pL\pM\pN].
tchrist

1
@tchrist: Presumo che, poiché ha menzionato specificamente l'AZ, vuole solo corrispondere a quello, anche se ammetto che la domanda potrebbe essere molto più chiara su questo punto. Chiederò un chiarimento.
Mark Byers

1
@ Mark, non stavo discutendo con la seconda parte della tua risposta, anche se se non ha decomposto canonicamente prima la stringa, non funzionerà correttamente. Stavo discutendo con la prima parte. Inoltre, cerco sempre di correggere le espressioni regolari che funzionano su qualsiasi dato, non solo su vecchi ASCII ammuffiti. :) Da qui il mantra che, da questa parte del Millennio, [A-Z]è sempre sbagliato, a volte .
tchrist

1
@Mark Byers, capisco .. e sì, preferisco il ima devo preoccuparmi solo di un gruppo demografico inglese .. Dimentico che molte persone devono pensare ad altre lingue. BTW ho appena notato che sei l'utente con la più alta reputazione che non ha mai fatto una domanda. Anche Jon Skeet ha fatto domande prima!
JD Isaacks

1
perché c'è un + alla fine della regexp? Non sarebbe ... lo stesso se lo rimuovessi?
Dennis

2

Piuttosto che preg_replace, puoi sempre usare le funzioni di filtro di PHP usando la filter_var()funzione con FILTER_SANITIZE_STRING.


PHP ha accesso all'algoritmo ISO Stringprep? So che Perl e Java lo fanno.
tchrist

Credo che la funzione di filtro di stringa funzioni prevalentemente con ASCII a 7 bit, ma non citarmi su questo.
Mark Baker

30
Per favore, puoi dirci un modo esplicito di fare ciò che l'utente chiede di utilizzare FILTER_SANITIZE_STRING? Per quanto ne so, il massimo che si può ottenere in questo modo è con FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH, ma ciò non lascerà solo lettere e numeri ma anche punti, barre, percentuali e tutto il resto.
Pere

$ iMycleanVar = filter_var ($ sStringWithNumbers, FILTER_SANITIZE_NUMBER_INT);
Sultanos

4
Sembra più un commento che una risposta. Fornisci una spiegazione adeguata mentre scrivi una risposta.
Siraj Alam

0
  1. Santize per numeri [ 0-9 ] e alfabeti in generale [ \ pL ]:
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. Santize specificamente per gli alfabeti dalla A alla Z (senza distinzione tra maiuscole e minuscole) [ a-zA-Z ]:
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.