• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
یک جایگزین مناسب برای eregi
#1
همانطور که می دانید توابعی چون eregi_replace و eregi که برای جستجو و جایگزینی ویژه عبارات باقاعده هستند در php 5.3 غیرفعال شده و در php 6.0 بطور کامل حذف می شوند. آیا تابعی پیش ساخته با عملکرد مشابه می شناسید؟
این تابع در php 5.2 موجود هست؟
در یک جایی preg_match معادل eregi پیشنهاد شده که البته فکر کنم کمی عملکردشان متفاوت باشد.
  پاسخ
تشکر شده توسط : molana
#2
درسته‌ عملکردشون متفاوت هست. اما نه از لحاظ خروجی و می تونن جایگربن همدیگه باشن دلیل این حذف هم حذف روش PCRE هست و فقط از روش perl استفاده میشه . پس شما هم بهتره روش عبارات با قاعده رو به روش perl قرار بدید
  پاسخ
تشکر شده توسط : molana
#3
ممکنه کمی کمکم کنید:
من تابع زیر را نوشتم:
کد پی‌اچ‌پی:
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 مشکل دار هست و طبق پست اولی تابع را همانند زیر تغییر دادم:
کد پی‌اچ‌پی:
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
یعنی حروف الفبا و .. را در عبارات با قاعده قبول نمی کنه؟
ضمنا دلیل حذف این تابع رو متوجه نشدم. زیر دیپلم بگید ما هم بفهمیم استاد
  پاسخ
تشکر شده توسط :
#4
کد پی‌اچ‌پی:
<?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
#5
خیلی ممنونم از بابت این کلاس با ارزش ولی فقط مشکل من detect مرورگر نیست. در بعضی از کلاسهام از eregi استفاده کردم که می خوام برای php 5.3 بهینه بشن و یک تابع جایگزین استفاده کنم
  پاسخ
تشکر شده توسط :
#6
ببینید دوست عزیز در داخل php ما از دو روش برای عبارات با قاعده استفاده می کنیم یکی PCRE که توابع مثل ereg از اون استفاده می کنن و یکی دیگه هم به صورت perl (که عموما از perl استفاده میشه به خاطر راحتی که داره) که توی توابعی که با preg شروع میشه از این استفاده میشه. حالا چون توی php6 فرمت PCRE دیگه استفاده نمیشه این توابع هم حذف شدن. و قاعدتا روش جایگزین که دقیقا مثل تابع ereg وجود داشته باشه نیست چون پشتیبانی از PCRE از بین رفته. به همین دلیل شما باید روشتون رو تغییر بدید. یعنی باید دقیقا عبارات باقاعده رو به فرمت perl ببرید. البته من جستجو کردم که ببینم آیا کسی ابزاری برای تبدیل قرار داده یا نه ولی نتیجه ای نداد
  پاسخ
تشکر شده توسط : Y.P.Y HiddeN
#7
تابع get_browser هم هست(معمولاً هم set شده):
http://php.net/manual/en/function.get-browser.php
وبلاگ: Yousha.Blog.ir

صدام: "اگر با ارتش شاه ایران طرف بودیم، یک ماهه جنگ را می بردیم"
http://gulfnews.com/opinion/thinkers/ira...i-1.500997
  پاسخ
تشکر شده توسط : nasserghiasi
#8
با این وضعیت باید کلی از عبارات با قاعده را به فرمت perl تغییر بدم. ولی این کار خیلی سخت و طاقت فرساست.
Y.P.Y عزیز تابعی که معرفی کردی بسیار مناسب هست ممنون ولی یک مشکل دیگه ای هم دارم:
با تابع set_magic_quotes_runtime() هم همین مشکلو دارم گویا این تابع هم در php 6 حذف میشه!
فکر کنم تابع get_browse نیاز به فایل تنظیمات browscap.ini داره
  پاسخ
تشکر شده توسط :


پرش به انجمن:


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