انجمن


باگ کوچولو در تابع farsi_num  (۱۸ نوشته)

  • farhadi

    آفلاین
    عضو
    تعداد نوشته‌ها: ۲۵
    تشکر شده: ۴ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۵ شهریور ۱۳۸۶ - ۱۱:۲۲

    سلام و خسته نباشید.

    در صورت انتخاب تبدیل اعداد به فارسی، یک مشکل کوچیک وجود داره و اون اینه که وقتی به عنوان مثال در متن پست خود کلمات انگلیسی نظیر J2EE و یا web2.0 استفاده میکنیم، این عدد ها نباید به فارسی تبدیل شوند.
    ضمنا بهتره در هنگام تبدیل اعداد اعشاری به جای نقطه از کاراکتر «/» استفاده بشه.

    من برای رفع مشکلات فوق تغییرات مختصری در دو تابع farsi_num و convertToFarsi دادم. کدش رو اینجا میگزارم تا در صورتی که صلاح دونستید این تغییر رو در ورژن های آتی اعمال کنید.

    function convertToFarsi($matches) {
    	$out = '';
    	if (isset($matches[1])) {
    		return str_replace(
    			array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."),
    			array("۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "/"),
    			$matches[1]);
    	}
    	return $matches[0];
    }
    
    function farsi_num($num,$fake = null,$fake2=null) {
    	return preg_replace_callback('/(?:&#\d{2,4};)|(\d+[\.\d]*)|(?:[a-z][\x21-\x3B\x3D-\x7F]*)|<\s*[^>]+>/i', 'convertToFarsi', $num);
    }

    با تشکر

  • saeid

    آفلاین
    عضو
    تعداد نوشته‌ها: ۱۳۹
    تشکر شده: ۳ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۵ شهریور ۱۳۸۶ - ۱۱:۵۷

    ضمنا بهتره در هنگام تبدیل اعداد اعشاری به جای نقطه از کاراکتر «/» استفاده بشه.

    این قسمت فکر نکنم صحیح باشه. استفاده از نقطه یک استاندارده. از / به عنوان کاراکتر تقسیم باید استفاده باشه ;)

  • farhadi

    آفلاین
    عضو
    تعداد نوشته‌ها: ۲۵
    تشکر شده: ۴ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۵ شهریور ۱۳۸۶ - ۱۲:۰۵

    با سلام

    چرا این کد اینجا با شکلک نمایش داده میشه؟!!
    من کد رو گذاشتم رو سایتم تا اگر خواستید دانلود کنید :

    http://farhadi.ir/downloads/farsi_num.php

    در رابطه با نقطه من با شما موافق نیستم، تو زبون فارسی حداقل تا به حال من ندیدم جایی برای اعشار از نقطه استفاده بشه و یا برای تقسیم از /.

    در هر صورت هر طور که صلاح دونستید عمل کنید. هر چی باشه صاحب اختیار شمایید.

    با تشکر

  • mazdakam

    آفلاین

    تعداد نوشته‌ها: ۱۴۵۳
    تشکر شده: ۱۲۲ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۵ شهریور ۱۳۸۶ - ۱۲:۲۲

    چرا این کد اینجا با شکلک نمایش داده میشه؟!!
    من کد رو گذاشتم رو سایتم تا اگر خواستید دانلود کنید :

    http://farhadi.ir/downloads/farsi_num.php

    در رابطه با نقطه من با شما موافق نیستم، تو زبون فارسی حداقل تا به حال من ندیدم جایی برای اعشار از نقطه استفاده بشه و یا برای تقسیم از /.

    در هر صورت هر طور که صلاح دونستید عمل کنید. هر چی باشه صاحب اختیار شمایید.

    فرهادی درست می‌گه باید نویسه‌ی « /» برای تقسیم به کار گرفته بشه
    و کاملا منطبق بر استاندارد ISIRI 6219
    هستش
    ممنون که گزارش دادی باز هم خطا دیدی گزارش بده :-)

  • mazdakam

    آفلاین

    تعداد نوشته‌ها: ۱۴۵۳
    تشکر شده: ۱۲۲ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۵ شهریور ۱۳۸۶ - ۱۲:۴۶

    چرا این کد اینجا با شکلک نمایش داده میشه؟

    خیلی عجیبه این دو تا رو با هم یکی در نظر می‌گیره!
    ),`

    ;)

  • گناهکار

    آفلاین
    کلیددار
    تعداد نوشته‌ها: ۳۵۳۵
    تشکر شده: ۲۵۴۵ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۵ شهریور ۱۳۸۶ - ۱۳:۰۹

    فرهادی جان ممنون از گزارشتون، حتمن بررسی می‌کنیم.

  • مانی

    آفلاین
    کلیددار
    تعداد نوشته‌ها: ۶۹۶
    تشکر شده: ۵۴ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۵ شهریور ۱۳۸۶ - ۲۳:۱۹

    اول از همه به آقای فرهادی خوش آمد می گم @},- خیلی خوشحالم که وردپرس فارسی فرصت خوبی شده برای آشنایی بیشتر با آدم های خوب وب فارسی...

    نمی دونم اقای نیما شایان فر رو می شناسید یا نه ... ایشون این تابع رو برای من نوشت تا تو پلاگین بگذارم. دیگه از اون به بعد زیاد باهاش ور نرفتم.

    این صفحه رو هم برای تست گذاشته بودم رو سرور خودم ولی آدرسش رو عمومی نکردم. واسه دیدن قدرت Regular Expression خیلی خوبه.

    من حتما تغییرات رو اعمال می کنم. نتیجه رو همین جا حتما اعلام می کنم.

    بازم ازتون ممنونم.

  • farhadi

    آفلاین
    عضو
    تعداد نوشته‌ها: ۲۵
    تشکر شده: ۴ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۶ شهریور ۱۳۸۶ - ۱۵:۲۹

    ممنون از لطفتون آقا مانی.
    آشنایی با شما باعث افتخاره.

    من واقعا از مشارکت با شما دوستان تو این پروژه لذت می‌برم. جدی می‌گم. چون این پروژه از همه لحاظ کامل و بی نقصه. بر خلاف اکثر پروژه های فارسی دیگه که مدت کوتاهی مدیریت نشده کار میکنند و بعد هم سایتش تعطیل میشه و دامینش میافته دست دلال های دامین.
    این پروژه می‌تونه الگوی خوبی برای بقیه باشه.

  • saeid

    آفلاین
    عضو
    تعداد نوشته‌ها: ۱۳۹
    تشکر شده: ۳ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۶ شهریور ۱۳۸۶ - ۱۵:۴۸

    در رابطه با نقطه من با شما موافق نیستم، تو زبون فارسی حداقل تا به حال من ندیدم جایی برای اعشار از نقطه استفاده بشه و یا برای تقسیم از /.

    از اون لحاظ خوب درسته. تسلیم ;)

    ولی در کل من با این استاندارد مخالفم

  • martianboy

    آفلاین
    عضو
    تعداد نوشته‌ها: ۱۱۳
    تشکر شده: ۱۳ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۶ شهریور ۱۳۸۶ - ۱۶:۵۲

    سعیدجان راستش من بر خلاف تو به طور کلی با این استاندارد موافقم. اونو کامل خوندم و به نظرم بر نیازهای زبان فارسی (با تمام هویتش) تلاش کرده. همین جداکننده‌ی اعشار توی زبان فارسی (که خوب از خط عربی استفاده می‌کنه) به شکل یک / هستش البته کوتاه‌تره. شاید ما توی انگلیسی عادت کرده باشیم به نقطه. ولی وقتی مداد به دست می‌گیریم و می‌نویسیم یک و نیم با نقطه نمی‌نویسیم. با ممیز می‌نویسم!

    با تشکر از آقای فرهادی که سعی کردن برای مشکل راه‌حل هم پیدا کنن. منم این مشکلات رو می‌دیدم ولی براشون دنبال راه حل نرفتم. ;)

  • farhadi

    آفلاین
    عضو
    تعداد نوشته‌ها: ۲۵
    تشکر شده: ۴ بار
    # نوشته شده: ۱۷ سال پیش
    ۱۷ شهریور ۱۳۸۶ - ۱۱:۵۴

    مجددا تغییرات بسیار مختصری در این دو تابع دادم لطفا اعمال فرمایید.
    کد جدید رو از آدرس http://farhadi.ir/downloads/farsi_num.php دریافت کنید.

    تغییرات جدید:
    1- در regex قسمت x21 به x20 تغییر کرد تا کارکتر Space هم در لیست کارکتر ها قرار گیرد.
    2- متغییر $out اضافه بود که حذف شد.

    این تغییر را روی وبلاگ خودم اعمال کردم که میتونید نیتجه کار رو اونجا ببینید :
    http://farhadi.ir/blog

  • farhadi

    آفلاین
    عضو
    تعداد نوشته‌ها: ۲۵
    تشکر شده: ۴ بار
    # نوشته شده: ۱۷ سال پیش
    ۴ مهر ۱۳۸۶ - ۱۴:۵۰

    سلام

    آقا من یکسری تغییرات دیگه هم دادم که گفتم اینجا بنویسم تا اگر صلاح دونستید توی ورژن ۲.۳ اعمال بشه.

    کد جدید رو از آدرس http://farhadi.ir/downloads/farsi_num.php دریافت کنید.
    الان هم روی وبلاگ خودم داره کار میکنه. میتونید ببینید.

    اما در مورد نحوه عملکردش هم بد نیست یک توضیح مختصر بدم که اگر کسی پیشنهادی داشت، بگه تا اعمال کنیم.

    این regex به دنبال اعداد میگرده و اونها رو با اعداد فارسی جایگزین میکنه ولی اعدادی رو که داخل تگ باشند و همچنین اعدادی رو که قبلشون کاراکتر انگلیسی باشه رو تبدیل نمیکنه.
    این هم فلوچارت نحوه عملکرد:
    1 - از کارکتر اول شروع کن
    2 - به گشتن در کارکتر ها ادامه بده
    3 - اگر عددی به طول حداقل 2 و حداکثر 4 پیدا شد که اولش «&#» بود و آخرش «;» از روش رد شو و برو به مرحله 2.
    4 - اگر یک کارکتر عددی و یا مجموعه ای از کاراکتر های عدد و نقطه پشت سر هم که با عدد شروع شود پیدا شد آن را به فارسی تبدیل کن و برو به مرحله 2
    5 - اگر کاراکتر انگلیسی (a-z) پیدا شد :
    5.1 - به گشتن ادامه بده
    5.2 - اگر هر کاراکتری با کد کمتر از 128 (کاراکتر های ASCII) به غیر از (<) بود از روش رد شو و برو به مرحله 5.1
    5.3 - اگر کاراکتر شروع تگ (>) پیدا شد تا رسیدن به کاراکتر پایان تگ(<) ادامه بده و از روش رد شو و برو به مرحله 5.1
    5.4 - برو به مرحله 2
    6 - اگر کاراکتر شروع تگ (>) پیدا شد تا رسیدن به کاراکتر پایان تگ(<) ادامه بده و از روش رد شو و برو به مرحله 2
    7 - پایان.

    جالبه نه!!
    با یک خط regex عجب کارهایی میشه کرد. جل الخالق!!

  • مانی

    آفلاین
    کلیددار
    تعداد نوشته‌ها: ۶۹۶
    تشکر شده: ۵۴ بار
    # نوشته شده: ۱۷ سال پیش
    ۵ مهر ۱۳۸۶ - ۱۲:۱۷

    اول از همه عذر می خوام آقای فرهادی که کمی دیر جواب می دم.

    کارتون عالیه. دستتون درد نکنه.

    من و گناهکار در حال آماده سازی نسخه جدید افزونه هستیم. حتما این تابع هم اصلاح می شه. سعی می کنم تو این صفحه benchmark هم تغییرات رو بدم تا بشه سرعتش رو هم تست کرد.

    ممنونم.

  • garfield

    آفلاین
    عضو
    تعداد نوشته‌ها: ۷۹۲
    تشکر شده: ۲۶۲ بار
    # نوشته شده: ۱۶ سال پیش
    ۲۰ خرداد ۱۳۸۷ - ۱۸:۲۷

    داداش، مت php بلد نیستم و به معکوس همین تابع احتیاج دارم. می خوام تاریخی رو که از تابع jdate می گیرم تو یک لینک استفاده کنم. ولی اعداد فارسی هستن و آدرس فایلم انگلیسی.

    اگه راه سریعی وجود داره که این کار رو بشه باهاش کرد ممنون می شم راهنمائیم کنید.

  • مانی

    آفلاین
    کلیددار
    تعداد نوشته‌ها: ۶۹۶
    تشکر شده: ۵۴ بار
    # نوشته شده: ۱۶ سال پیش
    ۲۱ خرداد ۱۳۸۷ - ۰۱:۴۵

    garfield گفت:
    داداش، مت php بلد نیستم و به معکوس همین تابع احتیاج دارم. می خوام تاریخی رو که از تابع jdate می گیرم تو یک لینک استفاده کنم. ولی اعداد فارسی هستن و آدرس فایلم انگلیسی.
    اگه راه سریعی وجود داره که این کار رو بشه باهاش کرد ممنون می شم راهنمائیم کنید.

    میشه با مثال منظورتون رو بگید؟

  • garfield

    آفلاین
    عضو
    تعداد نوشته‌ها: ۷۹۲
    تشکر شده: ۲۶۲ بار
    # نوشته شده: ۱۶ سال پیش
    ۲۱ خرداد ۱۳۸۷ - ۰۱:۵۳

    آره. می خوام مثلاْ اعداد تاریخ رو ( به این شکل ۱۳۸۷۰۴۰۶ ) توی آدرسی مثل آدرس زیر استفاده کنم.

    http://localhost/13870406.png

    در حالی که اگه خروجی تابع jdate رو مستقیماً استفاده کنم چنین چیزی تولید می شه:

    http://localhost/۱۳۸۷۰۴۰۶.png

    که چنین فایلی وجود خارجی نداره. باید اعداد از حالت فارسی به انگلیسی تبدیل بشن.

  • skywalker

    آفلاین
    عضو
    تعداد نوشته‌ها: ۷۲
    تشکر شده: ۶ بار
    # نوشته شده: ۱۶ سال پیش
    ۲۱ خرداد ۱۳۸۷ - ۰۲:۲۶

    گارفیلد جان اگه از اول دقیقا بگی چی میخوای آدم راحت تر میتونه کمک کنه تا اینکه هی تیکه تیکه سوال کنی.
    لارم نبود توی یه تاپیک دیگه مطرح کنی ، اینم راه حل :

    echo jdate("Y m d","now",true);
  • garfield

    آفلاین
    عضو
    تعداد نوشته‌ها: ۷۹۲
    تشکر شده: ۲۶۲ بار
    # نوشته شده: ۱۶ سال پیش
    ۲۱ خرداد ۱۳۸۷ - ۰۹:۰۲

    شرمنده. من یه چیزی می خوام، بعد به مشکل می خورم یه چیز دیگه می خوام! :D شرمنده. تکرار نمی شه. :P

درباره‌ی این موضوع



برچسب‌ها

هیچ برچسبی نیست.