Comment supprimer les caractères non alphanumériques d'une chaîne et conserver les espaces?


98

Je veux créer une expression régulière qui supprime tous les caractères non alphanumériques mais garde les espaces. Il s'agit de nettoyer l'entrée de recherche avant qu'elle n'atteigne la base de données. Voici ce que j'ai jusqu'à présent:

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

Le problème ici est qu'il supprime tous les espaces. Des solutions pour conserver les espaces?


Je ne fais pas de développement de Rails, mais pourquoi ne pouvez-vous pas laisser Rails faire le nettoyage?
Andrew Grimm

Réponses:


187

Ajoutez des espaces au groupe de caractères annulé:

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

4
L'espace vide ne fonctionnait pas pour moi, donc '\ s' peut aussi être une option: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas

6
un peu moins verbeux:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer

3
Juste pour préciser, cela supprime toutes les lettres accentuées et peut ne pas être adapté à certaines langues.
Uelb

@DavidDouglas Cela ne devrait \spas être\\s
Dex

9

Dans ce cas, j'utiliserais la méthode bang (gsub! Au lieu de gsub) afin de nettoyer l'entrée en permanence.

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

Cela évite une situation où @seach_query est utilisé ailleurs dans le code sans le nettoyer.


2
La version bang retournera nul si rien ne correspond. Probablement pas le résultat souhaité ou attendu. À partir de la documentation "Effectue les substitutions de String # gsub en place, en retournant str ou nil si aucune substitution n'a été effectuée. Si aucun bloc ni aucun remplacement n'est donné, un énumérateur est renvoyé à la place."
dft le

2
Dans son exemple, la valeur de retour n'est pas utilisée, donc ce n'est pratiquement pas pertinent.
Jaap Haagmans

3

J'aurais utilisé l'approche d'inclusion. Plutôt que d'exclure tout sauf les nombres, je n'inclurais que des nombres. Par exemple

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

0

Peut-être que cela fonctionnera dans un tel cas:

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

-3

Une meilleure réponse (au moins en rubis) est:

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

1
Cela supprimera (a) un caractère de mot unique ou (b) n'importe quel nombre d'espaces à partir du début de la chaîne. Complètement sans rapport avec la question, et donc pas une réponse.
Sigi

2
fait une grosse erreur ... je ne sais pas ce que je pensais: = (
John Doe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.