تبدیل اعداد فارسی و عربی به انگلیسی در PHP بدون str_replace

تبدیل اعداد فارسی و عربی به انگلیسی در PHP بدون str_replace
تبدیل اعداد فارسی و عربی به انگلیسی در PHP بدون str_replace


یکی از نکاتی که هر برنامه‌نویس PHP می‌بایست در طراحی فرم‌های فارسی در نظر بگیرد، این است که کیبورد کاربر در بسیاری از مواقع ممکن است فارسی یا عربی باشد و به همین خاطر کوئری کردن مقادیر عددی فارسی یا عربی در دیتابیس نتیجه‌بخش نخواهد بود.

در همین راستا، تبدیل ارقام فارسی/عربی به انگلیسی برای عناصری مثل کدملی، شماره شناسنامه و ... پیش از کوئری دیتابیس، الزامی است.

یکی از متداول‌ترین روش‌های تبدیل ارقام فارسی/عربی به انگلیسی که در بسیاری از سایت‌ها و منابع فارسی و لاتین پیشنهاد شده، استفاده از تابع str_replace یا strtr هست که من ترجیحاً یک نمونه از روش strtr رو در زیر آوردم:

function toEnNumber($input) {
    $replace_pairs = array(
          '۰' => '0', '۱' => '1', '۲' => '2', '۳' => '3', '۴' => '4', '۵' => '5', '۶' => '6', '۷' => '7', '۸' => '8', '۹' => '9',
          '٠' => '0', '١' => '1', '٢' => '2', '٣' => '3', '٤' => '4', '٥' => '5', '٦' => '6', '٧' => '7', '٨' => '8', '٩' => '9'
    );
    
    return strtr( $input, $replace_pairs );
}

اما علاوه بر روش بالا که نیازمند تعیین کاراکترهای عددی هست، میخوام یه روش استاندارد و اصولی‌تر رو بهتون آموزش بدم.

https://virgool.io/@skmohammadi/%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-syntax-highlighter-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%88%DB%8C%D8%B1%DA%AF%D9%88%D9%84-xpu1h4keneax

کلاس NumberFormatter در PHP

کلاس NumberFormatter یکی از کلاس‌های کمکی در مجموعه PHP Intl هست و به کمک اون میشه فرمت‌های مختلف عددی رو بهم تبدیل کرد و از این کلاس میخوام برای تبدیل اعداد فارسی/عربی به انگلیسی استفاده کنم.

تابع toEnNumber که بالاتر نوشته بودم رو اینطور بازتعریف می‌کنم:

function toEnNumber($input) {
     $fa_fmt = numfmt_create( 'fa', NumberFormatter::DECIMAL );
     $ar_fmt = numfmt_create( 'ar', NumberFormatter::DECIMAL );

     $output = numfmt_parse( $fa_fmt, $input );
     $output = numfmt_parse( $ar_fmt, $input );

     return $output;
}

در تعریف تابع toEnNumber، از تابع سازنده numfmt_create برای ایجاد کلاس NumberFormatter استفاده کردیم. این تابع دارای دو آرگومان هست. یکی Local و دیگری استایل Style یا Pattern که مقادیر ثابتی براش در نظر گرفته شده. سپس از فرمتر (Formatter)های ایجاد شده جهت parse کردن مقادیر ورودی استفاده می‌کنیم.

امیدوارم مفید واقع بشه :)