2009-04-10 49 views
44

Practico con Ruby y regex para eliminar ciertos caracteres no deseados. Por ejemplo:¿Cómo puedo eliminar caracteres especiales?

input = input.gsub(/<\/?[^>]*>/, '') 

y caracteres especiales, ejemplo ☻ o ™:

input = input.gsub('&#', '') 

Esto deja sólo números, bien. Pero esto sólo funciona si el usuario introduce un carácter especial como un código, por ejemplo:

&#153; 

Mi pregunta: ¿Cómo puedo borrar los caracteres especiales si el usuario introduce un carácter especial sin el código, así:

™ ☻ 

Respuesta

104

En primer lugar, creo que podría ser más fácil definir lo que constituye "entrada correcta" y eliminar todo lo demás. Por ejemplo:

input = input.gsub(/[^0-9A-Za-z]/, '') 

Si eso no es lo que quiere (desea apoyar alfabetos no latinos, etc.), entonces yo creo que se debe hacer una lista de los glifos que desea eliminar (como ™ o ☻), y eliminarlos uno a uno, ya que es difícil distinguir entre un carácter chino, árabe, etc. y una pictografía mediante programación.

Finalmente, es posible que desee normalizar su entrada mediante la conversión hacia o desde secuencias de escape de HTML.

+0

Gracias, creo que es más fácil crear una lista de caracteres permitidos. – Yud

+0

¡Gracias! He usado 'input = input.gsub (/ [^ 0-9A-Za-z] /, '')' para mantener la cadena como está. Me da algunos espacios adicionales en el lugar de estos caracteres especiales. – Surya

8

puede hacer coincidir todos los caracteres que desea, y luego unirlos, como esto:

original = "aøbæcå" 
stripped = original.scan(/[a-zA-Z]/).to_s 
puts stripped 

que saca "abc"

10

si sólo quería caracteres ASCII, entonces usted puede utilizar:

original = "aøbauhrhræoeuacå" 
cleaned = "" 
original.each_byte { |x| cleaned << x unless x > 127 } 
cleaned # => "abauhrhroeuac" 
7

Usted puede utilizar parameterize:

'@!#$%^&*()111'.parameterize 
=> "111" 
+0

Por favor, edite su respuesta para agregar una explicación de cómo funciona su código y cómo resuelve el problema del OP. Muchos de los carteles SO son novatos y no comprenderán el código que ha publicado. –

+0

Doc allí: http://apidock.com/rails/String/parameterize –

+0

Gotcha con parametrizar: deja guiones. Uso 'something-here'.underscore.parameterize para dar cuenta de ello. – emptywalls

3

Una forma más fácil de hacer esto inspirated por la respuesta Can Berk Güder es:

Para eliminar caracteres especiales:

input = input.gsub(/\W/, '') 

el fin de mantener caracteres de palabra:

input = input.scan(/\w/) 

En la entrada final es el mismo! Pruébalo: http://rubular.com/

Cuestiones relacionadas