2013-05-07 22 views
12

Uso PHP.Espressione regolare PHP - Rimuovi tutti i caratteri non alfanumerici

mio stringa può assomigliare a questo

This is a string-test width åäö and some über+strange characters: _like this?

Domanda

Esiste un modo per rimuovere i caratteri non alfanumerici e sostituirli con uno spazio? Qui ci sono alcuni caratteri non alfanumerici:

  • -
  • +
  • :
  • _
  • ?

Ho letto molti thread su di esso, ma non supportano altre lingue, come questo:

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

Requisiti

  • mio elenco di caratteri nessuno potrebbe lettera non essere completo.
  • Il mio contenuto contiene caratteri in diverse lingue, come åäöü. Potrebbe essere molto di più.
  • I caratteri non alfanumerici devono essere sostituiti con uno spazio. Altrimenti la parola verrebbe incollata l'una all'altra.

risposta

27

Si può provare questo:

preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string); 

\p{L} sta per tutti i caratteri alfabetici (qualunque sia l'alfabeto).

\p{N} sta per numeri.

Con i caratteri di modifica u della stringa dell'oggetto vengono considerati come caratteri unicode.

O questo:

preg_replace('~\P{Xan}++~u', ' ', $string); 

\p{Xan} contiene lettere e cifre unicode.

\P{Xan} contiene tutto ciò che non è lettere e cifre unicode. (Attenzione, contiene spazi bianchi anche che è possibile conservare con ~[^\p{Xan}\s]++~u)

Se si desidera un set più specifico di lettere consentite è necessario sostituire \p{L} con le gamme in unicode table.

Esempio:

preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string); 

Perché con un quantificatore possessivo (++) qui?

~\P{Xan}+~u ti darà lo stesso risultato di ~\P{Xan}++~u. La differenza qui è che nel primo il motore registra ogni posizione di backtracking (di cui non abbiamo bisogno) quando nel secondo non lo fa (come in un gruppo atomico). Il risultato è un piccolo profitto di rendimento.

Penso che sia una buona pratica usare quantificatori possessivi e gruppi atomici quando è possibile.

Tuttavia, il motore di espressione regolare PCRE rende automaticamente un quantificatore possessivo in situazioni evidenti (esempio: a+b =>a++b) eccetto Se il modulo PCRE è stato compilato con l'opzione PCRE_NO_AUTO_POSSESS.(http://www.pcre.org/pcre.txt)

Maggiori informazioni su quantificatori possessivi e gruppi atomici here (possessive quantifiers) e here (atomic groups) o here

+0

Questo. Tuttavia, a seconda di come sulla stringa, si potrebbe voler includere '\ X'. – Wrikken

+0

Il primo ha funzionato come previsto. Vota per questo. –

+0

Che cosa fa ++ ~ u? –

1

Non sono del tutto sicuro di quale varietà di regex si sta utilizzando. Tuttavia, le regex POSIX consentono di esprimere una classe alfabetica, dove [: alpha:] rappresenta qualsiasi carattere alfabetico.

in modo da provare:

preg_replace("/[^[:alpha:]0-9 ]/", '', $string); 

In realtà, ho dimenticato [: alnum:] - che rende più semplice:

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

Stai forse cercando \W?

Qualcosa di simile:

/[\W_]*/ 

Partite durante tutta carattere non alfanumerico e underscore.

\w partite tutti carattere di parola (alfabeto, numerica, sottolinea)

\W corrisponde a qualsiasi cosa non in \w.

Quindi, \W corrisponde a qualsiasi carattere non alfanumerico e si aggiunge il carattere di sottolineatura poiché \W non corrisponde ai caratteri di sottolineatura.

EDIT: Questo rende la vostra riga di codice diventano:

preg_replace("/[\W_]*/", ' ', $string); 

Il ' ' significa che tutti i caratteri corrispondenti (chi non la lettera e non numerici) diventeranno spazi bianchi.

rieditare: Si potrebbe inoltre voler utilizzare un altro preg_replace per rimuovere tutti gli spazi consecutivi e sostituirli con un unico spazio, altrimenti si finisce con:

This is a string test width  and some ber strange characters like this 

È possibile utilizzare:

preg_replace("/\s+/", ' ', $string); 

E infine tagliare gli spazi di inizio e di fine, se presenti.

1

\p{xx} è quello che stai cercando, credo, see here

Quindi, cercare:

preg_replace("/\P{L}+/u", ' ', $string); 
+0

Ma questo non sostituisce tutti i caratteri alfabetici che l'OP vuole lasciare dallo spazio? – Jerry

+0

Questo non dovrebbe sostituire alcun carattere alfabetico, no (notare la P maiuscola). – femtoRgon

+0

Oh, giusto. Ma allora, per quanto riguarda i caratteri numerici? Sono inclusi in 'L'? Non sono sicuro di cosa significhi la documentazione con 'lettera modificatore' o 'altra lettera'. – Jerry

Problemi correlati