Come si eliminano i caratteri non alfanumerici da una stringa e si mantengono gli spazi?


98

Voglio creare una regex che rimuova tutti i caratteri non alfanumerici ma mantenga gli spazi. Questo serve per pulire l'input di ricerca prima che raggiunga il database. Ecco cosa ho finora:

@search_query = @search_query.gsub(/[^0-9a-z]/i, '')

Il problema qui è che rimuove tutti gli spazi. Soluzioni su come trattenere gli spazi?


Non mi occupo dello sviluppo di Rails, ma perché non puoi lasciare che Rails faccia la sanificazione?
Andrew Grimm

Risposte:


187

Aggiungi spazi al gruppo di caratteri negato:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')

4
Lo spazio vuoto non ha funzionato per me, quindi "\ s" potrebbe anche essere un'opzione: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas

6
leggermente meno prolisso:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer

3
Giusto per la precisione, questo rimuove tutte le lettere accentate e potrebbe non essere adattato ad alcune lingue.
Uelb

@DavidDouglas Questo dovrebbe essere \snon\\s
Dex

9

In questo caso userei il metodo bang (gsub! Invece di gsub) per pulire l'input in modo permanente.

#permanently filter all non-alphanumeric characters, except _
@search_query.gsub!(/\W/,'')

Ciò evita una situazione in cui @seach_query viene utilizzato altrove nel codice senza pulirlo.


2
La versione bang restituirà zero se non è stato trovato nulla. Probabilmente non il risultato che vorresti o che ti aspetti. Dai documenti "Esegue le sostituzioni di String # gsub in posizione, restituendo str o nil se non sono state eseguite sostituzioni. Se non vengono forniti blocchi e sostituzioni, viene restituito un enumeratore".
dft

2
Nel suo esempio il valore restituito non viene utilizzato, quindi è praticamente irrilevante.
Jaap Haagmans

3

Avrei usato l'approccio dell'inclusione. Piuttosto che escludere tutto tranne i numeri, includerei solo numeri. Per esempio

@search_query.scan(/[\da-z\s]/i).join

0

Forse questo funzionerà in questo caso:

# do not replace any word characters and spaces
@search_query = @search_query.gsub(/[^\w ]/g, '')

-3

Una risposta migliore (almeno in rubino) è:

@search_query.gsub!(/^(\w|\s*)/,'')

1
Questo rimuoverà (a) un carattere di una singola parola o (b) qualsiasi numero di spazi bianchi dall'inizio della stringa. Completamente estraneo alla domanda, e quindi non una risposta.
Sigi

2
commesso un grosso errore .. non so cosa stavo pensando: = (
John Doe
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.