/
  • یک جایگزین مناسب برای eregi

  • ارسال پاسخ   امتیاز موضوع:
    • 1 رأی - میانگین امیتازات: 5
    • 1
    • 2
    • 3
    • 4
    • 5

    حالت موضوعی | حالت خطی یک جایگزین مناسب برای eregi
    نویسنده پیام
    nasserghiasi آفلاین
    ناصر GH
    ***

    ارسال‌ها: 242
    تاریخ عضویت: ۱۳۸۸ آذر ۷
    اعتبار: 2
    تشکرها : 127
    ( 41 تشکر در 22 ارسال )
    ارسال: #1
    یک جایگزین مناسب برای eregi
    همانطور که می دانید توابعی چون eregi_replace و eregi که برای جستجو و جایگزینی ویژه عبارات باقاعده هستند در php 5.3 غیرفعال شده و در php 6.0 بطور کامل حذف می شوند. آیا تابعی پیش ساخته با عملکرد مشابه می شناسید؟
    این تابع در php 5.2 موجود هست؟
    در یک جایی preg_match معادل eregi پیشنهاد شده که البته فکر کنم کمی عملکردشان متفاوت باشد.
    ۱۳۸۸ بهمن ۴ ۱۲:۴۸ صبح
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : molana
    admin آفلاین
    وحید سهرابلو
    **********

    ارسال‌ها: 5,697
    تاریخ عضویت: ۱۳۸۷ آذر ۲۴
    اعتبار: 100
    تشکرها : 1362
    ( 6197 تشکر در 3438 ارسال )
    ارسال: #2
    RE: یک جایگزین مناسب برای eregi
    درسته‌ عملکردشون متفاوت هست. اما نه از لحاظ خروجی و می تونن جایگربن همدیگه باشن دلیل این حذف هم حذف روش PCRE هست و فقط از روش perl استفاده میشه . پس شما هم بهتره روش عبارات با قاعده رو به روش perl قرار بدید
    ۱۳۸۸ بهمن ۴ ۰۱:۲۲ صبح
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : molana
    nasserghiasi آفلاین
    ناصر GH
    ***

    ارسال‌ها: 242
    تاریخ عضویت: ۱۳۸۸ آذر ۷
    اعتبار: 2
    تشکرها : 127
    ( 41 تشکر در 22 ارسال )
    ارسال: #3
    RE: یک جایگزین مناسب برای eregi
    ممکنه کمی کمکم کنید:
    من تابع زیر را نوشتم:
    کد PHP:
    function getBrowser($userAgent) {
        
    $browsers = array(
            
    'Opera' => 'Opera',
            
    'Mozilla Firefox'=> '(Firebird)|(Firefox)'
            
    'Galeon' => 'Galeon',
            
    'Mozilla'=>'Gecko',
            
    'MyIE'=>'MyIE',
            
    'Lynx' => 'Lynx',
            
    'Netscape' => '(Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79)',
            
    'Konqueror'=>'Konqueror',
            
    'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)',
            
    'Internet Explorer 8' => '(MSIE 8\.[0-9]+)',        
            
    'Internet Explorer 7' => '(MSIE 7\.[0-9]+)',
            
    'Internet Explorer 6' => '(MSIE 6\.[0-9]+)',
            
    'Internet Explorer 5' => '(MSIE 5\.[0-9]+)',
            
    'Internet Explorer 4' => '(MSIE 4\.[0-9]+)',
        );

        foreach(
    $browsers as $browser=>$pattern) { 
            if(
    eregi($pattern$userAgent)) { 
                return 
    $browser
            }
        }
        return 
    'Unknown'


    حالا این تابع در php 5.3 مشکل دار هست و طبق پست اولی تابع را همانند زیر تغییر دادم:
    کد PHP:
    function getBrowser($userAgent) {
        
    $browsers = array(
            
    'Opera' => 'Opera',
            
    'Mozilla Firefox'=> '(Firebird)|(Firefox)'
            
    'Galeon' => 'Galeon',
            
    'Mozilla'=>'Gecko',
            
    'MyIE'=>'MyIE',
            
    'Lynx' => 'Lynx',
            
    'Netscape' => '(Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79)',
            
    'Konqueror'=>'Konqueror',
            
    'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)',
            
    'Internet Explorer 8' => '(MSIE 8\.[0-9]+)',        
            
    'Internet Explorer 7' => '(MSIE 7\.[0-9]+)',
            
    'Internet Explorer 6' => '(MSIE 6\.[0-9]+)',
            
    'Internet Explorer 5' => '(MSIE 5\.[0-9]+)',
            
    'Internet Explorer 4' => '(MSIE 4\.[0-9]+)',
        );

        foreach(
    $browsers as $browser=>$pattern) { 
            if(
    preg_match($pattern,$userAgent$browserPREG_OFFSET_CAPTURE3)) { 
                return 
    $browser
                
    //; FIXME!
            
    }
        }
        return 
    'Unknown'

    اما در نتیجه خطای زیر را در خروجی می دهد:
    کد:
    Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in E:\wamp\www\store1\kernel\functions\functions.php  on line 387

    Warning: preg_match() [function.preg-match]: Unknown modifier '|' in E:\wamp\www\store1\kernel\functions\functions.php on line 387
    یعنی حروف الفبا و .. را در عبارات با قاعده قبول نمی کنه؟
    ضمنا دلیل حذف این تابع رو متوجه نشدم. زیر دیپلم بگید ما هم بفهمیم استاد
    (آخرین ویرایش در این ارسال: ۱۳۸۸ بهمن ۴ ۰۱:۳۶ صبح، توسط nasserghiasi.)
    ۱۳۸۸ بهمن ۴ ۰۱:۳۵ صبح
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط :
    admin آفلاین
    وحید سهرابلو
    **********

    ارسال‌ها: 5,697
    تاریخ عضویت: ۱۳۸۷ آذر ۲۴
    اعتبار: 100
    تشکرها : 1362
    ( 6197 تشکر در 3438 ارسال )
    ارسال: #4
    RE: یک جایگزین مناسب برای eregi
    کد PHP:
    <?PHP
    class Browser
    {
        private 
    $props    = array("Version" => "0.0.0",
                                    
    "Name" => "unknown",
                                    
    "Agent" => "unknown") ;

        public function 
    __Construct()
        {
            
    $browsers = array("firefox""msie""opera""chrome""safari",
                                
    "mozilla""seamonkey",    "konqueror""netscape",
                                
    "gecko""navigator""mosaic""lynx""amaya",
                                
    "omniweb""avant""camino""flock""aol");

            
    $this->Agent strtolower($_SERVER['HTTP_USER_AGENT']);
            foreach(
    $browsers as $browser)
            {
                if (
    preg_match("#($browser)[/ ]?([0-9.]*)#"$this->Agent$match))
                {
                    
    $this->Name $match[1] ;
                    
    $this->Version $match[2] ;
                    break ;
                }
            }
        }

        public function 
    __Get($name)
        {
            if (!
    array_key_exists($name$this->props))
            {
                die 
    "No such property or function $name)" ;
            }
            return 
    $this->props[$name] ;
        }

        public function 
    __Set($name$val)
        {
            if (!
    array_key_exists($name$this->props))
            {
                
    SimpleError("No such property or function.""Failed to set $name"$this->props) ;
                die ;
            }
            
    $this->props[$name] = $val ;
        }

    }

    ?>

    example code
    <?PHP
    $browser 
    = new Browser ;
    echo 
    "$Browser->Name $Browser->Version;
    ?>
    ۱۳۸۸ بهمن ۴ ۱۲:۲۱ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : nasserghiasi paull
    nasserghiasi آفلاین
    ناصر GH
    ***

    ارسال‌ها: 242
    تاریخ عضویت: ۱۳۸۸ آذر ۷
    اعتبار: 2
    تشکرها : 127
    ( 41 تشکر در 22 ارسال )
    ارسال: #5
    RE: یک جایگزین مناسب برای eregi
    خیلی ممنونم از بابت این کلاس با ارزش ولی فقط مشکل من detect مرورگر نیست. در بعضی از کلاسهام از eregi استفاده کردم که می خوام برای php 5.3 بهینه بشن و یک تابع جایگزین استفاده کنم
    ۱۳۸۸ بهمن ۴ ۰۴:۳۷ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط :
    admin آفلاین
    وحید سهرابلو
    **********

    ارسال‌ها: 5,697
    تاریخ عضویت: ۱۳۸۷ آذر ۲۴
    اعتبار: 100
    تشکرها : 1362
    ( 6197 تشکر در 3438 ارسال )
    ارسال: #6
    RE: یک جایگزین مناسب برای eregi
    ببینید دوست عزیز در داخل php ما از دو روش برای عبارات با قاعده استفاده می کنیم یکی PCRE که توابع مثل ereg از اون استفاده می کنن و یکی دیگه هم به صورت perl (که عموما از perl استفاده میشه به خاطر راحتی که داره) که توی توابعی که با preg شروع میشه از این استفاده میشه. حالا چون توی php6 فرمت PCRE دیگه استفاده نمیشه این توابع هم حذف شدن. و قاعدتا روش جایگزین که دقیقا مثل تابع ereg وجود داشته باشه نیست چون پشتیبانی از PCRE از بین رفته. به همین دلیل شما باید روشتون رو تغییر بدید. یعنی باید دقیقا عبارات باقاعده رو به فرمت perl ببرید. البته من جستجو کردم که ببینم آیا کسی ابزاری برای تبدیل قرار داده یا نه ولی نتیجه ای نداد
    ۱۳۸۸ بهمن ۴ ۰۷:۰۷ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : Y.P.Y HiddeN
    Y.P.Y آفلاین
    ناظم کل
    *******

    ارسال‌ها: 2,782
    تاریخ عضویت: ۱۳۸۷ دي ۲۸
    اعتبار: 103
    تشکرها : 2181
    ( 4856 تشکر در 2220 ارسال )
    ارسال: #7
    RE: یک جایگزین مناسب برای eregi
    تابع get_browser هم هست(معمولاً هم set شده):
    http://php.net/manual/en/function.get-browser.php
    __________________________________________________________________________
    وبلاگ: Yousha.Blog.ir

    صدام: "اگر با ارتش شاه ایران طرف بودیم، یک ماهه جنگ را می بردیم"
    http://gulfnews.com/opinion/thinkers/ira...i-1.500997
    ۱۳۸۸ بهمن ۴ ۰۹:۳۰ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : nasserghiasi
    nasserghiasi آفلاین
    ناصر GH
    ***

    ارسال‌ها: 242
    تاریخ عضویت: ۱۳۸۸ آذر ۷
    اعتبار: 2
    تشکرها : 127
    ( 41 تشکر در 22 ارسال )
    ارسال: #8
    RE: یک جایگزین مناسب برای eregi
    با این وضعیت باید کلی از عبارات با قاعده را به فرمت perl تغییر بدم. ولی این کار خیلی سخت و طاقت فرساست.
    Y.P.Y عزیز تابعی که معرفی کردی بسیار مناسب هست ممنون ولی یک مشکل دیگه ای هم دارم:
    با تابع set_magic_quotes_runtime() هم همین مشکلو دارم گویا این تابع هم در php 6 حذف میشه!
    فکر کنم تابع get_browse نیاز به فایل تنظیمات browscap.ini داره
    (آخرین ویرایش در این ارسال: ۱۳۸۸ بهمن ۵ ۰۹:۲۱ عصر، توسط nasserghiasi.)
    ۱۳۸۸ بهمن ۵ ۰۹:۰۶ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط :
    « قدیمی تر | تازه‌ تر »

    ارسال پاسخ
    پرش به انجمن:


    کاربرانِ درحال بازدید از این موضوع: 1 مهمان
    IranPHP.org | تماس با ما | بازگشت به بالا | بازگشت به محتوا | بایگانی | پیوند سایتی RSS