2008-12-22 13 views
9

Mam tę aplikację do quizu, w której pasuję do tego, co ludzie wpisują z właściwą odpowiedzią. Na razie, co mogę zrobić, to w zasadzie, że:Jak mogę zignorować akcenty podczas porównywania ciągów w Perlu?

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

Miło, jakby odpowiedź brzmi „ryba” użytkownik może wpisać „rybę” i liczy się dobrą odpowiedź.

Problem, z którym się borykam, polega na tym, że, cóż, moi użytkownicy, ponieważ jestem Francuzem, i chciałbym móc zaakceptować, powiedzmy, użytkownika piszącego "taton", a odpowiedź brzmi "tâton".

Więc, co mogę zrobić, to:

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

I w moim rutynowej kontroli, zrobić:

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

i coś podobnie z odpowiedzią.

Nie podoba mi się to, ponieważ muszę mocno kodować rzeczy, a kiedy zdecyduję, że opuszczam świat ISO-8859-15 dla świata UTF-8, jestem skazany na zagładę.

Poszukuję więc sposobu na porównanie ciągów, które sprawią, że "tâton" eq "taton", "maçon" eq "macon" lub "macon" =~ /maçon/ będzie prawdziwe.

+0

Wadą jest to, że użytkownik może wpisać: "samolubne krasnale", a oni nadal będą poprawni. –

+0

To był tylko przykład, i, no cóż, mogliby również wpisać cały słownik za każdym razem :-) – mat

+0

Prawdopodobnie chcesz tam jakieś granice słów: m/\ b $ answer \ b/ –

Odpowiedz

0

Nie wydaje się to właściwą okazją do wywoływania wyrażeń regularnych - powinieneś po prostu mieć listę akceptowalnych odpowiedzi, a także niektóre filtrowanie w celu usunięcia nieistotnych słów, takich jak "a", "the", oraz ich odpowiedniki dla danego języka .

Cokolwiek robisz, wydaje mi się oczywiste, że musi to być kodowanie znaków i świadomość językowa. Wyrażenia regularne zazwyczaj nie są ani.

Powiązane problemy