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.