كيف يمكنني تجاهل لهجات عند مقارنة السلاسل في بيرل؟

StackOverflow https://stackoverflow.com/questions/386459

سؤال

لدي تطبيق الاختبار هذا حيث أضع ما يكتبه الأشخاص بالإجابة الصحيحة. الآن، ما أقوم به هو أساسا:

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/ كن صادق.

هل كانت مفيدة؟

المحلول

جرب ال النص :: غير مؤمن الوحدة النمطية من CPAN (أو النص :: غير مؤمن :: PurePerl).

نصائح أخرى

هذا لا يبدو وكأنه مناسبة مناسبة لاستدعاء التعبيرات العادية - يجب أن يكون لديك ببساطة قائمة بالإجابات المقبولة، بالإضافة إلى بعض التصفية لإزالة الكلمات غير المساسة مثل "A"، ""، ومعادلاتهم الخاصة لغتهم.

مهما فعلت، يبدو من الواضح لي أنه يجب أن يكون على علم ترميز الشخصية وعدم اللغة. تعبيرات منتظمة هي عادة لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top