• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
شباهت بین دو رشته
#1
دوستان تابع مشابه با similar_text() برای رشته های utf8 می شناسید؟
این تابع تعداد کاراکترهای مشابه بین دو رشته رو برمیگردونه

برای رشته های فارسی درست عمل نمی کنه، مثال زیر رو ببینید:
کد پی‌اچ‌پی:
echo similar_text("سلا","سلما");
//result is 6, it is wrong
echo similar_text("salam","sam");
//result is 3, it is right 
  پاسخ
تشکر شده توسط :
#2
فکر کنم چون حروف فارسی رو دو کاراکتر حساب میکنه اینطوری شده.
برا توابعی که با mb_ شروع میشدن هم یه مشکل همینطوری بوجود میومد که با mb_internal_encoding("UTF-8"); حل میشد.
در صورت پیدا نشدن تابعی مشابه mb_internal_encoding("UTF-8"); شما میتونید از کد های پایین استفاده کنید.
کد پی‌اچ‌پی:
$tedad similar_text("تستی","تست");
echo 
$tedad 2
یا :
کد پی‌اچ‌پی:
echo similar_text(utf8_decode("تستی"),utf8_decode("تست")); 
ولی در کل فکر کنم یه تنظیماتی تویه php.ini باید انجام بشه تا utf-8 زبان پیش فرض بشه و همه توابع برای زبان فارسی بدون مشکل کار کنن
طراحی و برنامه نویسی صفحات پویا - Iranveb.net
پورتال جدیدترین اخبار داخل و خارج کشور - Iranveb.com
  پاسخ
تشکر شده توسط : admin parvane Alimokhlesi HiddeN oia amir.s میلاد
#3
یک راه دیگه هم این هست. که بیاید از این تابع استفاده کنید.
کد پی‌اچ‌پی:
function fixPersianString($text){
       if(
is_null($text))
          return 
null;
       
$replacePairs = array(
                
chr(0xD9).chr(0xA0) => chr(0xDB).chr(0xB0),
                
chr(0xD9).chr(0xA1) => chr(0xDB).chr(0xB1),
                
chr(0xD9).chr(0xA2) => chr(0xDB).chr(0xB2),
                
chr(0xD9).chr(0xA3) => chr(0xDB).chr(0xB3),
                
chr(0xD9).chr(0xA4) => chr(0xDB).chr(0xB4),
                
chr(0xD9).chr(0xA5) => chr(0xDB).chr(0xB5),
                
chr(0xD9).chr(0xA6) => chr(0xDB).chr(0xB6),
                
chr(0xD9).chr(0xA7) => chr(0xDB).chr(0xB7),
                
chr(0xD9).chr(0xA8) => chr(0xDB).chr(0xB8),
                
chr(0xD9).chr(0xA9) => chr(0xDB).chr(0xB9),
                
chr(0xD9).chr(0x83) => chr(0xDA).chr(0xA9),
                
chr(0xD9).chr(0x89) => chr(0xDB).chr(0x8C),
                
chr(0xD9).chr(0x8A) => chr(0xDB).chr(0x8C),
                
chr(0xDB).chr(0x80) => chr(0xD9).chr(0x87) . chr(0xD9).chr(0x94));
       return 
strtr($text$replacePairs);
   } 

ین تابع یک رشته یونی‌کد را گرفته و نویسه‌های غیرفارسی موجود در آن را با نویسه‌های فارسی عوض می‌کند.
http://www.idevcenter.com/wiki/list_of_p...characters
http://www.idevcenter.com/wiki/list_of_n...characters
از این تابع می‌توانید برای اصلاح رشته‌های ورودی کاربران استفاده کنید.
  پاسخ
تشکر شده توسط : amir.s میلاد parvane oia
#4
یه توضیح کلی در مورد این جور مشکلات بدم که مثلا چرا strlen برای کاراکترهای فارسی دو تا مقدار رو در نظر می گیره و موارد مشابه دلیل این هست که این جور توابع روی مقدار بیتی کار می کنن. و چون کاراکترهای فارسی دو بایتی هستن بنابراین همیشه دوتا درنظر میگیرن
  پاسخ
تشکر شده توسط : parvane
#5
ممنون از جواب همه Smile
فقط ببینید من الان دو تا رشته که هیچ اشتراکی ندارن رو تست کردم ولی نتیجه اش رو ببینید:
کد پی‌اچ‌پی:
echo similar_text(fixPersianString('با'),fixPersianString('تست')); //result is 2
    
echo similar_text(utf8_decode('با'),utf8_decode('تست')); //result is 2 
نتیجه رو 2 برمیگردونه، در صورتی که هیچ اشتراکی ندارن
یا این یکی که رشته ها وجه اشتراک دارن:

کد پی‌اچ‌پی:
echo similar_text(fixPersianString('رتا'),fixPersianString('تست')); //result is 3
    
echo similar_text(utf8_decode('تبا'),utf8_decode('تست')); //result is 3 
اینجا هم 3 برمی گردونه Huh
  پاسخ
تشکر شده توسط :
#6
شما با این تابع نمی تونید کار کنید چون درای روی یک بایت کار می کنه ولی فارسی دو بایتی هست. ممکنه مثلا بایت اول حرف ت با بایت دوم حرف الف یکی باشه پس یک مقدار مشابه پیدا کرده
  پاسخ
تشکر شده توسط : parvane
#7
متد مشابه برای رشته های فارسی وجود نداره؟
  پاسخ
تشکر شده توسط :
#8
پیشنهادی نبود؟
  پاسخ
تشکر شده توسط :
#9
شما می تونید متد مشابه رو با توابع php بنویسید
  پاسخ
تشکر شده توسط : parvane oia
#10
اره ظاهرا باید دست به کار بشم..تموم شد توی فروم میزارم
  پاسخ
تشکر شده توسط : amir.s HiddeN Alimokhlesi oia


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان