Come rimuovere i caratteri non alfanumerici?


349

Devo rimuovere tutti i caratteri da una stringa che non sono nel a-z A-Z 0-9set o non sono spazi.

Qualcuno ha una funzione per fare questo?

Risposte:


695

Sembra quasi che tu sapessi già cosa volevi fare, in pratica lo definivi una regex.

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

8
zuk1: regexbuddy è di grande aiuto in questo
ricomincia

2
Ecco un esempio se si desidera includere il trattino tra i caratteri consentiti. Ne avevo bisogno perché dovevo rimuovere i caratteri non consentiti da un nome utente Moodle, in base agli indirizzi e-mail: preg_replace ("/ [^ a-z0-9 _. @ \ -] /", '', $ string);
Evan Donovan,

2
Funzionerebbe esattamente allo stesso modo con gli apostrofi (virgolette singole) attorno all'espressione regolare, anziché le virgolette (virgolette doppie)? Ad esempio:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625

3
Vogliamo una spiegazione al riguardo :). Le persone vengono qui per vedere perché è così. Si prega di considerare anche la spiegazione di Regex! Grazie
Pratik il

1
E se vogliamo mantenere personaggi accentuati?
wonzbak,

169

Per i caratteri Unicode, è:

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

ciao voondo, come va la cosa / ui .. come la chiami? qualcuno può per favore farmi luce. Grazie.
kebyang,

4
Per chiarimenti, si chiamano flag. Vengono inseriti dopo il delimitatore di chiusura (in questo caso è "/", ma potrebbe essere "~" o "@" o qualunque carattere si desideri utilizzare purché i delimitatori di apertura e chiusura siano gli stessi) e modificare il comportamento dell'espressione.
Doktor J,

1
A proposito, \winclude \de quindi \dnon è necessario. Inoltre, questo è sbagliato perché lascerà anche i trattini bassi nella stringa risultante (che è anche inclusa in \w).
Smathy

2
C'è ancora un errore in questo, le classi di caratteri devono essere terminate con ':]' quindi la riga corretta sarebbe: preg_replace ("/ [^ [: alnum:] [: space:]] / ui", '', $ string);
h00ligan,

4
La ibandiera è davvero necessaria qui poiché [:alnum:]copre già entrambi i casi?
Billynoah,

50

L'espressione regolare è la tua risposta.

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • È l' iacronimo di case insensitive.
  • ^ significa che non inizia con.
  • \d corrisponde a qualsiasi cifra.
  • a-zcorrisponde a tutti i caratteri tra ae z. A causa del iparametro non è necessario specificare a-ze A-Z.
  • Dopo che \dc'è uno spazio, quindi gli spazi sono ammessi in questa regex.

3
Vogliamo una spiegazione al riguardo :). Le persone vengono qui per vedere perché è così. Si prega di considerare anche la spiegazione di Regex! Non tutti sono abbastanza avanzati per sapere cosa hai scritto lì senza spiegazioni. Grazie
Pratik il

@PratikCJoshi I sta per maiuscole e minuscole. ^ significa che non inizia con. \ d corrisponde a qualsiasi cifra. az corrisponde a tutti i caratteri tra a e z. A causa del parametro i non è necessario specificare az e AZ. Dopo \ d c'è uno spazio, quindi gli spazi sono consentiti in questa regex.
Bart

1
Le persone non leggono i commenti come risposta. Si prega di aggiornare la risposta!
Pratik,

18

ecco una regex davvero semplice per questo:

\W|_

e usato come serve (con un /delimitatore di barra).

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

Provalo qui con questo fantastico strumento che spiega cosa sta facendo il regex:

http://www.regexr.com/


1
Hai ancora bisogno della /ubandiera, altrimenti vengono rimosse anche le lettere non ascii.
Xeoncross,

Pulito, ma corrisponderebbe anche agli spazi e se questo è voluto, probabilmente potrebbe raddoppiare le prestazioni usando una classe di caratteri e un quantificatore aggiuntivo per uno o più [\W_]+
bobble bubble

18

Se devi supportare altre lingue, anziché la tipica AZ, puoi usare quanto segue:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]definisce una classe di caratteri negata (corrisponderà a un carattere non definito) di:
    • \p{L}: una lettera da qualsiasi lingua.
    • \p{N}: un carattere numerico in qualsiasi script.
    • : un personaggio spaziale.
  • + corrisponde avidamente alla classe del personaggio tra 1 e un numero illimitato di volte.

Ciò conserverà lettere e numeri di altre lingue e script, nonché AZ:

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

Nota: questa è una domanda molto vecchia, ma comunque rilevante. Sto rispondendo esclusivamente per fornire informazioni supplementari che potrebbero essere utili ai futuri visitatori.


8
[\W_]+

 

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

Seleziona tutto non AZ, az, 0-9 ed eliminalo.

Vedi esempio qui: https://regexr.com/3h1rj


1
cosa significa regex / [\ W _] + / u?
Ângelo Rigo,

\Wè l'inverso dei \wquali sono personaggi A-Za-z0-9_. Quindi \Wabbinerà qualsiasi personaggio che non lo è A-Za-z0-9_e li rimuoverà. Il []è un limite di set di caratteri . Il +è ridondante su un confine di set di caratteri, ma normalmente significa 1 o più caratteri. Il uflag espande l'espressione per includere il supporto caratteri Unicode, il che significa che non rimuoverà i caratteri oltre il codice carattere 255 come ª²³µ. Esempio di vari usi 3v4l.org/hSVV5 con caratteri Unicode e ASCII.
fyrye,


0

Stavo cercando anche la risposta e la mia intenzione era quella di pulire ogni non alfa e non avrei dovuto avere più di uno spazio.
Quindi, ho modificato la risposta di Alex a questo, e questo funziona per me. preg_replace('/[^a-z|\s+]+/i', ' ', $name)
La regex di cui sopra si è trasformata sy8ed sirajul7_islamin sy ed sirajul islam
Spiegazione: regex controllerà NESSUNA dalla a alla z nel caso insensibile o più di uno spazio bianco, e verrà convertito in un singolo spazio.


-2

Puoi dividere la stringa in caratteri e filtrarla.

<?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

?>

Motivo del downvote: 3v4l.org/fqLVZ Inoltre, chiamare funzioni (3 + N) su una stringa di lunghezza sconosciuta sembra davvero poco attraente rispetto a una singola e semplice preg_replace()chiamata.
Mickmackusa,
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.