9

我有这个测验应用程序,我将人们输入的内容与正确答案相匹配。现在,我所做的基本上是:

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

很好,好像答案是“鱼”,用户可以输入“一条鱼”并算作一个好的答案。

我面临的问题是,我的用户是法国人,我希望能够接受,比如说,用户输入“taton”,答案是“tâton”。

所以,我能做的是:

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

在我的检查程序中,执行:

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

以及同样的答案。

我不喜欢它,因为我必须对事物进行硬编码,而当我决定离开 ISO-8859-15 世界转向 UTF-8 世界的那一天,我注定要失败。

所以,我正在寻找一种比较字符串的方法,这将使"tâton" eq "taton""maçon" eq "macon"或者"macon" =~ /maçon/是真的。

4

2 回答 2

14

尝试 CPAN 中的Text::Unaccent模块(或Text::Unaccent::PurePerl)。

于 2008-12-22T16:05:34.677 回答
0

这似乎不是调用正则表达式的合适场合——您应该简单地列出可接受的答案,加上一些过滤以删除非必要的词,如“a”、“the”及其特定语言的等价词。

无论你做什么,对我来说似乎很明显它必须是字符编码感知和语言感知的。正则表达式通常两者都不是。

于 2009-01-28T04:24:57.200 回答