2011-05-23 17 views
80

Quiero crear una expresión regular que elimine todos los caracteres que no sean alfanuméricos, pero conserva los espacios. Esto es para limpiar la entrada de búsqueda antes de que llegue al db. Esto es lo que tengo hasta ahora:¿Cómo elimino caracteres no alfanuméricos de una cadena y mantengo espacios?

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

El problema aquí es que elimina todos los espacios. ¿Soluciones sobre cómo retener espacios?

+0

I do not do Rails de desarrollo, pero ¿por qué no puedes dejar que Rails haga la desinfección? –

Respuesta

153

Añadir espacios para el grupo de caracteres negada:

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

El espacio vacío no funcionó para mí, por lo que '\ s' también puede ser una opción: @ search_query.gsub (/ [^ 0-9a-z \\ s]/i, '') –

+3

ligeramente menos prolijo: '@ search_query.gsub! (/ [^ 0-9a-z]/i, '')' – benjineer

+2

Solo para precisar, esto elimina todas las letras acentuadas y puede que no se adapte a algunos idiomas. – Oxynum

-3

Una mejor respuesta (al menos en rubí) es:

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

Esto eliminará (a) un carácter de una sola palabra o (b) cualquier cantidad de espacios en blanco desde el comienzo de la cadena. Completamente sin relación con la pregunta, y por lo tanto, no una respuesta. – Sigi

+1

cometió un gran error ... no sé lo que estaba pensando: = ( –

5

En este caso me gustaría utilizar el método de explosión (gsub lugar! de gsub) para limpiar la entrada permanentemente.

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

Esto evita que @seach_query se use en otro lugar del código sin limpiarlo.

+2

) La versión de bang devolverá nil si no se combinó nada. Probablemente no es el resultado que desea o espera. De los documentos _ "Realiza las sustituciones de String # gsub in place, return str, o nil si no se realizaron sustituciones. Si no se proporciona ningún bloque ni reemplazo, se devuelve un enumerador en su lugar. "_ – dft

+1

En su ejemplo, el valor de retorno no se usa, por lo que es prácticamente irrelevante. –

1

Hubiera usado el enfoque de inclusión. En lugar de excluir todos los números, solo incluiría los números. P.ej.

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