با سلام.من میخواستم دوتا رشته فارسی رو با هم مقایسه کنم که یکیش از دیتابیس میخونم.در حین انجام عمل مقایسه فهمیدم که مثلا دوتا رشته 'پیمان' و 'پیمان' رو مساوی نمیگیره چون یکیش با ی عربی هست اونیکی با ی فارسی.در مورد رشته خط فاصله یا ' ' هم این مشکلات وجود داشت و این مسئله خیلی گیجم کرده .کسی راه حل جامعی برای این موضوع داره؟
من برای پروژه هام یه کاری میکنم قبل از ذخیره سازی دیتا تو دیتابیس میام و تمام حروف رو به فارسی تبدیل میکنم که هر کس با هر کیبوردی تایپ کرد. چیزی که من میخوام تو دیتابیسم ذخیره بشه. و همچنین قبل از سرچ کردن هم این کار رو انجام میدم که چیزی که کاربر تایپ میکنه با دیتابیس یکی بشه.
تابع تبدیل حروف عربی به فارسی + تبدیل نیم فاصله که تو ورد هست به فاصله کامل:
/**
* Replace Arabic char with Persian char
* @param string $string
* @return string
*/
public static function repalcePersianChar(string $string): string
{
$arrayOfChars = [
""=>
" ",
"ي"=>
"ی",
"ى" =>
"ی",
"ك"=>
"ک"
];
foreach ($arrayOfChars as $find => $replace){
$string = str_replace($find, $replace, $string);
}
return $string;
}
کد رو تو php storm بزارید اون خط اول که ظاهرا هیچ چیز توش نیست تو آرایه رو درست نمایش میده که کاراکتر نیم فاصله رو داره
سلام
دستور زیر که جواب میدهد و نتیجه این مقایسه عدد 0 نیست
strcmp("پیمان","پيمان");
خروجی تابع (str1, str2)strcmp سه حالت زیر می باشد:
در صورتی که دو رشته با هم برابر باشند، مقدار 0 را برمی گرداند.
اگر رشته 1 از رشته 2 بزرگتر باشد، عددی بزرگتر از 0 را برمی گرداند.
اگر رشته 1 از رشته 2 کوچکتر باشد، عددی کوچکتر از 0 را برمی گرداند.
یک راه هم نوشتن متدی است که کاراکترها را به یونیکد تبدیل کند و سپس مقایسه بین آنها انجام شود
سلام وقتتون بخیر!
به یونیکد هم تبدیل کنه باز کار نمیکنه
این ۲ تا با هم یکی نیست
۱
1
مشکل همینجاست که این دوتا رشته از نظر سیستم نامساویند و عدد 0 بر نمی گردونه. ولی از نظر ما مساویند.برا این کار میشه از تابع زیر استفاده کرد
function charchange($string) {
$string = str_replace("ك", 'ک', $string);
$string = str_replace("ي", 'ی', $string);
return ($string);
}
ولی در رشته ای مثل "فروشگاه پیمان" که خط فاصله دارد این تابع کار نمیکنه
سلام
یکی از کارهای جالبی که میشه انجام داد اینه که کلمات فارسی رو تبدیل به fingilish کنید و بعد مقایسه کنید من خودم تا حالا تست نکردم. می تونید از unicode هم استفاده کنید.
U+641 'ف' ARABIC LETTER FEH
U+631 'ر' ARABIC LETTER REH
U+64A 'ي' ARABIC LETTER YEH <- 1
U+62F 'د' ARABIC LETTER DAL
U+648 'و' ARABIC LETTER WAW
U+646 'ن' ARABIC LETTER NOON
U+643 'ك' ARABIC LETTER KAF <- 2
U+646 'ن' ARABIC LETTER NOON
U+627 'ا' ARABIC LETTER ALEF
U+631 'ر' ARABIC LETTER REH
U+641 'ف' ARABIC LETTER FEH
U+631 'ر' ARABIC LETTER REH
U+6CC 'ی' ARABIC LETTER FARSI YEH <- 1
U+62F 'د' ARABIC LETTER DAL
U+648 'و' ARABIC LETTER WAW
U+646 'ن' ARABIC LETTER NOON
U+6A9 'ک' ARABIC LETTER KEHEH <- 2
U+646 'ن' ARABIC LETTER NOON
U+627 'ا' ARABIC LETTER ALEF
U+631 'ر' ARABIC LETTER REH
@mohaligateway
این روش خوبیه منتها برای من کاربرد نداره چون اینجوریه که میخواهم فیلدی که جستجو میشه یکتا باشه و وقتی fingilish بشه مثلا آب , ab یکی میشه که من نمیخوام ایطور اتفاقی بیفته
"این دوتا رشته از نظر سیستم نامساویند و عدد ۰ بر نمی گردونه. ولی از نظر ما مساویند"
یعنی چی
کاری که میخواهید انجام بدهید چیه؟
کد تون (متد تون) را قرار بدهید تا بهتر راهنمایی کنیم
ورژن لاراول تون چیه؟
@mahdiam200
متد strcmp که مشکلی نداره
این هم یک مثال تست کنید
echo strcmp("فروشگاه علی پیمانی","فروشگاه علي پیماني");
@Rp76 متد strcmp که اوکی هست ولی یونیکد هم جواب میده
@majid.mohamadisamani
نگاه کل کاری که من میخواهم انجام بدم اینه. یه جدول در پایگاه داده دارم که هر کدوم از رکورداش 2 تا صفت key_string که یکتاست و body دارند. و قرار هست که کاربران با ارسال مقدار key_string رکورد مقدار body رکورد رو دریافت کنند.حالا بعضی وقتا هست که کاربر کیبوردش عربی هست و به عنوان مثال پیمان با ی عربی مینویسه و این مورد باعث میشه که اگر پیمان با ی عربی بنویسه دیگه برنامه مساوی بودن این پیمان با پیمانی که داخل دیتابیس ذکر شده تشخیص نده.حالا این مسئله رو با تابع charchange که در بالا گفتم حل کردم منتها حروف دیگه ای هم وجود دارند که ایطوری اند مثل اعداد و فاصله و ....حالا سوال من اینجاست که اولا آیا حروف دیگهای هم به این شکل وجود داره؟و اینکه فاصله رو چجور درست کنم؟چون امکان داره فاصله از طرف http بیاد و به%20 و ... تبدیل بشه. همچنین @mohaligateway به معادلسازی unicode اشاره کردند که ممنون میشم توضیح بیشتری در این زمینه بدهند.
اول از هر چیز اگر میشه برای keystring یک فرمت خاص و با معنا (نام لاتین + تاریخ عضویت ، نام لاتین + سال تولد) و بدون حروف فارسی و فاصله در نظر بگیرید که در ادامه از این قبیل مشکلات نداشته باشید
اما با این وضعیت که فرمودید باید چند کار انجام بدهید
کار 1: ایجاد یک شرط با متد strcmp که دو رشته را مقایسه کنید اگر نتیجه صفر شد که برابر هستند (کار تمام است) و ادامه بیزینس شما ولی در غیر اینصورت کار 2
کار 2: حال که برابر نیستند از همان متد charchange استفاده کنید (کامل کنید)
بدین صورت که اول %20 ها را با replace به فاصله تبدیل کن
بعد با استفاده از یک حلقه بیا و چندتا فاصله ها را به یک فاصله تبدیل کن
مثلا "علي رضا احمدي" بشه "علي رضا احمدي"
حالا برای ی و ک عربی به فارسی و همین طور اعداد 0 تا 9 فارسی یا عربی به اعداد لاتین هم از replace استفاده کن
کار 3: مجددا استفاده از شرط با متد strcmp که دو رشته را مقایسه کنید اگر نتیجه صفر شد که برابر هستند ولی در غیر اینصورت پیام مناسب به کاربر
اگر موارد فوق کار ساز نبود یک نمونه از keystring را که دارید قرار بدهید تا بتونم بررسی کنم راهکار دقیق تری بگم
شما الان کلمات مد نظرتون رو داخل گوگل سرچ کنید البته به فارسی می تونید ببینید که به صورت encode شده در URL قرار می گیره. تا حالا احتمالا زیاد دید URL های طولانی رو. این موارد برای utf8 هست که سیستم به صورت encode شده به زبون خودش می خونه. زبان php برای تبدیل کردن بین متن encode شده و decode شده توابعی رو در نظر گرفته با همین نام ها وقتی encode می کنید دیگه این مشکل به وجود نمیاد. امیدوارم تونسته باشم خوب توضیح بدم براتون
@mahdiam200
من برای پروژه هام یه کاری میکنم قبل از ذخیره سازی دیتا تو دیتابیس میام و تمام حروف رو به فارسی تبدیل میکنم که هر کس با هر کیبوردی تایپ کرد. چیزی که من میخوام تو دیتابیسم ذخیره بشه. و همچنین قبل از سرچ کردن هم این کار رو انجام میدم که چیزی که کاربر تایپ میکنه با دیتابیس یکی بشه.
تابع تبدیل حروف عربی به فارسی + تبدیل نیم فاصله که تو ورد هست به فاصله کامل:
/**
* Replace Arabic char with Persian char
* @param string $string
* @return string
*/
public static function repalcePersianChar(string $string): string
{
$arrayOfChars = [
""=>
" ",
"ي"=>
"ی",
"ى" =>
"ی",
"ك"=>
"ک"
];
foreach ($arrayOfChars as $find => $replace){
$string = str_replace($find, $replace, $string);
}
return $string;
}
کد رو تو php storm بزارید اون خط اول که ظاهرا هیچ چیز توش نیست تو آرایه رو درست نمایش میده که کاراکتر نیم فاصله رو داره
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟