2008-12-22 32 views
9

Tengo esta aplicación de prueba en la que comparto lo que las personas escriben con la respuesta correcta. Por ahora, lo que hago es básicamente que:¿Cómo puedo ignorar los acentos al comparar cadenas en Perl?

if ($input =~ /$answer/i) { 
    print "you won"; 
} 

Es agradable, como si la respuesta es "pescado" el usuario puede escribir "un pez" y ser contado una buena respuesta.

El problema que estoy enfrentando es que, bueno, mis usuarios son franceses, y me gustaría poder aceptar, por ejemplo, que un usuario escriba "taton", y la respuesta es "tâton".

Por lo tanto, lo que podría hacer, es:

use POSIX qw(locale_h); 
use locale; 
setlocale(LC_TYPE, "fr_FR.ISO8859-15"); 
setlocale(LC_COLLATE, "fr_FR.ISO8859-15"); 

Y en mi revisión de rutina, hacer un:

$input = lc($input); 
$input =~ tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/; 

y algo del mismo modo con la respuesta.

No me gusta, porque tengo que codificar cosas, y el día que decida que me voy del mundo ISO-8859-15 para el mundo UTF-8, estoy condenado.

Por lo tanto, estoy buscando una manera de comparar cadenas, que hará que "tâton" eq "taton", "maçon" eq "macon" o "macon" =~ /maçon/ sea cierto.

+0

El inconveniente es que el usuario podría escribir: "gnomos egoístas" y seguirían siendo correctos. –

+0

Era solo un ejemplo, y, bueno, también podían escribir todo el dictionnary cada vez :-) – mat

+0

Es probable que desee algunos límites de palabras allí: m/\ b $ answer \ b/ –

Respuesta

0

Esto no parece ser una ocasión apropiada para invocar expresiones regulares; simplemente debe tener una lista de respuestas aceptables, más algunos filtros para eliminar palabras no esenciales como "a", "el" y sus equivalentes específicos del idioma .

Hagas lo que hagas, me parece obvio que debe ser consciente de la codificación de caracteres y del lenguaje. Las expresiones regulares normalmente no lo son.

Cuestiones relacionadas