آژانس هواپیمایی
pop up

regex

شروع موضوع توسط sasan_66 ‏7 آگوست 2007 در انجمن PHP

  1. sasan_66

    sasan_66 کاربر تازه وارد

    تاریخ عضویت:
    ‏18 جولای 2006
    نوشته ها:
    450
    تشکر شده:
    0
    مي خوام از توي اين رشته:
    [12.159.46.200]
    IP رو با اين الگو:
    PHP:
    (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
    بدست بيارم
    نميدونم چرا خروجي ام اين شكلي ميشه!
    12.159.46.20
    آخرين صفر 200 نميدونم كجا ميره!
    البته با \b\b مشكل حل ميشه ولي مي خوام بدونم چرا عبارت بعد از ‍{3} درست عمل نمي كنه
     
  2. firebird

    firebird Registered User

    تاریخ عضویت:
    ‏2 جولای 2005
    نوشته ها:
    1,424
    تشکر شده:
    9
    کد:
    \b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
     
  3. sasan_66

    sasan_66 کاربر تازه وارد

    تاریخ عضویت:
    ‏18 جولای 2006
    نوشته ها:
    450
    تشکر شده:
    0
    خوب يه سوال در مورد همين كدتون
    فرض كنيد b\ رو از ابتدا و انتهاي الگو برداريم و الگوي مربوط به هر عدد رو كمي دست كاري كنيم يعني عبارت
    PHP:
    [01]?[0-9][0-9]?
    بذاريم قبل از
    PHP:
    25[0-5]
    خوب تو اين مورد هم آخرين صفر 200 مي پره!
    آيا موقع استفاده از | فرقي مي كنه كه الگو هامون ترتيبشون چه طوري باشه؟
    در مورد مثال بالا انگار فرق مي كنه ولي فقط تو چهارمين عدد IP
    هدف من از اين تاپيك پيدا كردن regex درست براي ip نيست بلكه مي خوام بدونم چرا كدي كه قبلا نوشتم يا كد پاييني درست كار نمكنه؟
    PHP:
    (([01]?[0-9][0-9]?|25[0-5]|2[0-4][0-9])\.){3}([01]?[0-9][0-9]?|25[0-5]|2[0-4][0-9])
    يه سوال ديگه هم داشتم
    ميخوام توسط عبارت زير متن مابين تگ <h1> را توسط U\ به حروف بزرگ تبديل كنم
    regex:
    PHP:
    (<[Hh]1>)(.*?)(<\/[Hh]1>)
    replace:
    PHP:
    $1\U$2\E$3
    ولي نميدونم چرا U\ كار نمي كنه
     
  4. firebird

    firebird Registered User

    تاریخ عضویت:
    ‏2 جولای 2005
    نوشته ها:
    1,424
    تشکر شده:
    9
    در مورد پریدن صفر. بله این مسأله وجود داره. regex اولین موردی که در بین (....|....|....) منطبق ببینه رو برمیداره و به بقیه توجه نمیکنه. (یه چیزی مثل if..elseif...elseif هست).
    حالا وقتی شما به جای اینکه
    کد:
    2[0-4][0-9]
    رو اول بذاری اومدی
    کد:
    [01]?[0-9][0-9]? 
    رو اول گذاشتی. مشخصه که ربطی به
    کد:
    25[0-5] 
    نداره چون اصلاً 200 توی اون تطبیق نمیکنه. حالا مشکل 200 با
    کد:
    [01]?[0-9][0-9]? 
    که یک صفرش میپره چی هست. مسأله اینجاست که علامت ? معنیش "صفر بار با یک بار" هست و تو این regex عدد 2 اول 200 تو
    کد:
    [01]?
    مطابقت نمیکنه. اما تو
    کد:
    [0-9]
    مطابقت میکنه. بقیش دیگه مشخص هست که چی میشه. سر صفر آخر بیکلاه میمونه. راه حلش ایکه که یا همون ترتیب رو رعایت کنی یا به جای ? از {1} استفاده کنی. اون قسمت آخر مثلاً میشه
    کد:
    ([01]{1}[0-9][0-9]?|25[0-5]|2[0-4][0-9])
    که البته با دو رقمی ها مشکل داره پس بهتر هست همون ترتیب رو رعایت کنی.


    در مورد سوال دومت مطمئن نیستم ولی فکر کنم عبارت جایگزین به شکل
    کد:
    \1\u2\3
    باشه.
     
  5. sasan_66

    sasan_66 کاربر تازه وارد

    تاریخ عضویت:
    ‏18 جولای 2006
    نوشته ها:
    450
    تشکر شده:
    0
    خوب قبول كه بايد تريتب رو حفظ كنم و از بزرگ به كوچيك بنويسم ولي خوب همين شرايط براي سه گروه اول IPوجود داره و من اونارو به ترتيب كوچيك به بزرگ نوشتم ولي براي 3 گروه اول مشكلي به وجود مي ياد چرا؟
    PHP:
    (([01]?[0-9][0-9]?|25[0-5]|2[0-4][0-9]).){3}([01]?[0-9][0-9]?|25[0-5]|2[0-4][0-9])  
     
  6. firebird

    firebird Registered User

    تاریخ عضویت:
    ‏2 جولای 2005
    نوشته ها:
    1,424
    تشکر شده:
    9
    برای اینكه تو عبارت تست شما (12.159.46.20) اونا با 2 شروع نمیشن.
     
  7. boxilink
  8. sasan_66

    sasan_66 کاربر تازه وارد

    تاریخ عضویت:
    ‏18 جولای 2006
    نوشته ها:
    450
    تشکر شده:
    0
    خوب تو اين كد:
    PHP:
    (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
    از كوچيك به بزرگ نوشتم
    و عدد زير رو مي خوام تست كنم:
    PHP:
    250.241.225.125
    اينجام پنج 125 ميپره ولي در مورد سه گروه اول هيچ مشكلي نيست. چرا؟