我有这个测验应用程序,在那里我的比赛什么人类正确的答案。现在,我要做的就是基本上是:

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

它是好的,因为如果答案是"鱼类"用户可以输入"鱼"和计算一个很好的答案。

这个问题,我们面临的是,嗯,我的用户,因为我是法国人,我希望能够接受,也就是说,一个用户输入"托顿怀特",并回答是"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/ 是真实的。

有帮助吗?

解决方案

尝试 文字的::Unaccent 模块从支持(或 文字的::Unaccent::PurePerl).

其他提示

这似乎并不像调用正则表达式一个适当的场合 - 你应该简单地具有可接受答案的列表,加上一些过滤去除,如“一”,“中”,和他们的特定语言的等效不必要的话。

不管你做什么,似乎很明显,我认为它必须是字符编码感知和语言感知。正则表达式通常是既不。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top