سلام دوستان فرم ثبت نامی که من در نظر گرفتم برای پروژه ام شماره همراه و پسورد داره که وقتی با گوشی وارد میشم و اعداد فارسی میزنم نمیشناسه برای تبدیل اعداد فارسی به انگلیسی توی هلپر این کد رو قرار دادم
function normalize_number($string)
{
$persian = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];
$arabic = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
$num = range(0, 9);
$convertedPersianNums = str_replace($persian, $num, $string);
$englishNumbersOnly = str_replace($arabic, $num, $convertedPersianNums);
return $englishNumbersOnly;
}
و در formRequest این کد رو
public function prepareForValidation()
{
$this->merge([
'mobile_no' => normalize_number($this->mobile_no)
]);
}
public function rules()
{
return [
'name' => ['required', 'string', 'max:255'],
'mobile_no' => ['required', 'regex:/[0-9]{11}/', 'digits:11', 'unique:users'],
'password' => ['required', 'string', 'min:8'],
];
}
در RegisterController هم این کد رو
protected function validator(array $data)
{
return Validator::make($data, app(RegisterRequest::class)->rules());
}
ولی باز هم فرمت نامعتبر میزنه
شاید پاسخ شما همینجا باشد
در دنیای برنامه نویسی نمیشه چشم بسته مشکلی رو برطرف کرد. باید مسئله تون رو بشکنید به زیرمجموعههای کوچک تر و مرحله به مرحله دیباگ کنید تا برسید به نقطه مسئله زا.
اول از کارکرد تابع normalizenumber تون خاطر جمع بشید که آیا خروجیش همون چیزی هست که انتظار دارید یا نه... مثلا خروجیش رو همون اول die and dump کنید و ببینید. یا از tinker استفاده کنید و مقادیر مختلف بهش بدید و خروجیش رو چک کنید.
ضمنا چیزی که همینجوری مشخصه آرایههایی که برای اعداد فارسی و عربی و انگلیسی نوشتید هم باگ دارند:
$persian = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];
$arabic = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
$num = range(0, 9);
اولا ترتیب مورد اول برعکس دو مورد بعدی هست! و ثانیا مقادیر فارسی در اصل عربی هستند و مقادیر عربی هم که به اشتباه کلا انگلیسی خوردند!
یک نکته حاشیه ای هم اینکه شاید خیلی مهم نباشه اما سعی کنیم از نام گذاری های صحیح و استاندارد برای متغیرها و توابعمون استفاده کنیم. تجربه نشون داده در غیر اینصورت وقتی پروژه بزرگ میشه اشک در بیار خواهندشد. در مثال شما هم من باب پیشنهاد بهتر بود اسم تابع مثلا به to_en_num تبدیل بشه تا دقیقا مشخص باشه چه کاری انجام میده. یا برای سه تا متغیر آرایه اعداد مثلا از نامهای farsi_nums و arabic_nums و english_nums استفاده بشه.
سلام. ببین من این تابعو توی ری اکت نوشتم. منطقش به دردت میخوره احتمالا
export function convertPersianDigits(str) {
return str.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d) {
return d.charCodeAt(0) - 1632; // Convert Arabic numbers
}).replace(/[0123456789]/g, function (d) {
return d.charCodeAt(0) - 1776; // Convert Persian numbers
});
}@kazemi ممنون . تابعی که نوشتم هم درسته و توی لپ تاپ درست اجرا میشه و مشکلی نداره نمیدونم چرا توی موبایل هیچ تغییری نمیکنه ، کش موبایل رو هم پاک کردم :(