مهدی
3 سال پیش توسط مهدی مطرح شد
13 پاسخ

مقایسه دو رشته فارسی

با سلام.من میخواستم دوتا رشته فارسی رو با هم مقایسه کنم که یکیش از دیتابیس میخونم.در حین انجام عمل مقایسه فهمیدم که مثلا دوتا رشته 'پیمان' و 'پیمان' رو مساوی نمیگیره چون یکیش با ی عربی هست اونیکی با ی فارسی.در مورد رشته خط فاصله یا ' ' هم این مشکلات وجود داشت و این مسئله خیلی گیجم کرده .کسی راه حل جامعی برای این موضوع داره؟


ثبت پرسش جدید
hooman
تخصص : برنامه نویس
@hooman.programmer 3 سال پیش آپدیت شد
2

من برای پروژه هام یه کاری میکنم قبل از ذخیره سازی دیتا تو دیتابیس میام و تمام حروف رو به فارسی تبدیل میکنم که هر کس با هر کیبوردی تایپ کرد. چیزی که من میخوام تو دیتابیسم ذخیره بشه. و همچنین قبل از سرچ کردن هم این کار رو انجام میدم که چیزی که کاربر تایپ میکنه با دیتابیس یکی بشه.
تابع تبدیل حروف عربی به فارسی + تبدیل نیم فاصله که تو ورد هست به فاصله کامل:

/**
     * 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 بزارید اون خط اول که ظاهرا هیچ چیز توش نیست تو آرایه رو درست نمایش میده که کاراکتر نیم فاصله رو داره


مجید سامانی
تخصص : Web Developer
@majid.mohamadisamani 3 سال پیش آپدیت شد
1

سلام
دستور زیر که جواب میدهد و نتیجه این مقایسه عدد 0 نیست

strcmp("پیمان","پيمان");

خروجی تابع (str1, str2)strcmp سه حالت زیر می باشد:
در صورتی که دو رشته با هم برابر باشند، مقدار 0 را برمی گرداند.
اگر رشته 1 از رشته 2 بزرگتر باشد، عددی بزرگتر از 0 را برمی گرداند.
اگر رشته 1 از رشته 2 کوچکتر باشد، عددی کوچکتر از 0 را برمی گرداند.

یک راه هم نوشتن متدی است که کاراکترها را به یونیکد تبدیل کند و سپس مقایسه بین آنها انجام شود

@mahdiam200


رضا پارسیان
تخصص : توسعه دهنده Php , Laravel
@Rp76 3 سال پیش آپدیت شد
-2

@majid.mohamadisamani

سلام وقتتون بخیر!
به یونیکد هم تبدیل کنه باز کار نمیکنه

این ۲ تا با هم یکی نیست

۱
1


مهدی
تخصص : برنامه نویس
@mahdiam200 3 سال پیش آپدیت شد
0

@majid.mohamadisamani
@Rp76

مشکل همینجاست که این دوتا رشته از نظر سیستم نامساویند و عدد 0 بر نمی گردونه. ولی از نظر ما مساویند.برا این کار میشه از تابع زیر استفاده کرد

    function charchange($string) {
        $string = str_replace("ك", 'ک', $string);
        $string = str_replace("ي", 'ی', $string);
        return ($string);
    }

ولی در رشته ای مثل "فروشگاه پیمان" که خط فاصله دارد این تابع کار نمیکنه


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
0

سلام
یکی از کارهای جالبی که میشه انجام داد اینه که کلمات فارسی رو تبدیل به 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

@mahdiam200


مهدی
تخصص : برنامه نویس
@mahdiam200 3 سال پیش مطرح شد
0

@mohaligateway
این روش خوبیه منتها برای من کاربرد نداره چون اینجوریه که میخواهم فیلدی که جستجو میشه یکتا باشه و وقتی fingilish بشه مثلا آب , ab یکی میشه که من نمیخوام ایطور اتفاقی بیفته


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
0

پس باید از معادلسازی unicode استفاده کنید. اینطوری دیگه صدرصدی هست.
@mahdiam200


مهدی
تخصص : برنامه نویس
@mahdiam200 3 سال پیش مطرح شد
0

@mohaligateway
میشه در مورد معادلسازی unicode بیشتر توضیح بدید؟


مجید سامانی
تخصص : Web Developer
@majid.mohamadisamani 3 سال پیش آپدیت شد
1

"این دوتا رشته از نظر سیستم نامساویند و عدد ۰ بر نمی گردونه. ولی از نظر ما مساویند"
یعنی چی
کاری که میخواهید انجام بدهید چیه؟
کد تون (متد تون) را قرار بدهید تا بهتر راهنمایی کنیم
ورژن لاراول تون چیه؟
@mahdiam200

متد strcmp که مشکلی نداره
این هم یک مثال تست کنید

echo strcmp("فروشگاه علی پیمانی","فروشگاه علي پیماني");

@Rp76 متد strcmp که اوکی هست ولی یونیکد هم جواب میده


مهدی
تخصص : برنامه نویس
@mahdiam200 3 سال پیش مطرح شد
0

@majid.mohamadisamani
نگاه کل کاری که من میخواهم انجام بدم اینه. یه جدول در پایگاه داده دارم که هر کدوم از رکورداش 2 تا صفت key_string که یکتاست و body دارند. و قرار هست که کاربران با ارسال مقدار key_string رکورد مقدار body رکورد رو دریافت کنند.حالا بعضی وقتا هست که کاربر کیبوردش عربی هست و به عنوان مثال پیمان با ی عربی مینویسه و این مورد باعث میشه که اگر پیمان با ی عربی بنویسه دیگه برنامه مساوی بودن این پیمان با پیمانی که داخل دیتابیس ذکر شده تشخیص نده.حالا این مسئله رو با تابع charchange که در بالا گفتم حل کردم منتها حروف دیگه ای هم وجود دارند که ایطوری اند مثل اعداد و فاصله و ....حالا سوال من اینجاست که اولا آیا حروف دیگه‌ای هم به این شکل وجود داره؟و اینکه فاصله رو چجور درست کنم؟چون امکان داره فاصله از طرف http بیاد و به%20 و ... تبدیل بشه. همچنین @mohaligateway به معادلسازی unicode اشاره کردند که ممنون میشم توضیح بیشتری در این زمینه بدهند.


مجید سامانی
تخصص : Web Developer
@majid.mohamadisamani 3 سال پیش آپدیت شد
1

اول از هر چیز اگر میشه برای keystring یک فرمت خاص و با معنا (نام لاتین + تاریخ عضویت ، نام لاتین + سال تولد) و بدون حروف فارسی و فاصله در نظر بگیرید که در ادامه از این قبیل مشکلات نداشته باشید

اما با این وضعیت که فرمودید باید چند کار انجام بدهید
کار 1: ایجاد یک شرط با متد strcmp که دو رشته را مقایسه کنید اگر نتیجه صفر شد که برابر هستند (کار تمام است) و ادامه بیزینس شما ولی در غیر اینصورت کار 2
کار 2: حال که برابر نیستند از همان متد charchange استفاده کنید (کامل کنید)
بدین صورت که اول %20 ها را با replace به فاصله تبدیل کن

بعد با استفاده از یک حلقه بیا و چندتا فاصله ها را به یک فاصله تبدیل کن

مثلا "علي       رضا احمدي" بشه "علي رضا احمدي"

حالا برای ی و ک عربی به فارسی و همین طور اعداد 0 تا 9 فارسی یا عربی به اعداد لاتین هم از replace استفاده کن

کار 3: مجددا استفاده از شرط با متد strcmp که دو رشته را مقایسه کنید اگر نتیجه صفر شد که برابر هستند ولی در غیر اینصورت پیام مناسب به کاربر

اگر موارد فوق کار ساز نبود یک نمونه از keystring را که دارید قرار بدهید تا بتونم بررسی کنم راهکار دقیق تری بگم

@mahdiam200


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
0

شما الان کلمات مد نظرتون رو داخل گوگل سرچ کنید البته به فارسی می تونید ببینید که به صورت encode شده در URL قرار می گیره. تا حالا احتمالا زیاد دید URL های طولانی رو. این موارد برای utf8 هست که سیستم به صورت encode شده به زبون خودش می خونه. زبان php برای تبدیل کردن بین متن encode شده و decode شده توابعی رو در نظر گرفته با همین نام ها وقتی encode می کنید دیگه این مشکل به وجود نمیاد. امیدوارم تونسته باشم خوب توضیح بدم براتون
@mahdiam200


hooman
تخصص : برنامه نویس
@hooman.programmer 3 سال پیش آپدیت شد
2

من برای پروژه هام یه کاری میکنم قبل از ذخیره سازی دیتا تو دیتابیس میام و تمام حروف رو به فارسی تبدیل میکنم که هر کس با هر کیبوردی تایپ کرد. چیزی که من میخوام تو دیتابیسم ذخیره بشه. و همچنین قبل از سرچ کردن هم این کار رو انجام میدم که چیزی که کاربر تایپ میکنه با دیتابیس یکی بشه.
تابع تبدیل حروف عربی به فارسی + تبدیل نیم فاصله که تو ورد هست به فاصله کامل:

/**
     * 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 بزارید اون خط اول که ظاهرا هیچ چیز توش نیست تو آرایه رو درست نمایش میده که کاراکتر نیم فاصله رو داره


Mohammad reza Golshahi
تخصص : Go - Python
@golshahimohammadreza 1 سال پیش مطرح شد
0
similar_text($str1 , $str2 , $percent)
echo $percent

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام