برگزیده های پرشین تولز

regex

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} درست عمل نمي كنه
 

firebird

Registered User
تاریخ عضویت
2 جولای 2005
نوشته‌ها
1,424
لایک‌ها
10
سن
46
کد:
\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
 

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\ كار نمي كنه
 

firebird

Registered User
تاریخ عضویت
2 جولای 2005
نوشته‌ها
1,424
لایک‌ها
10
سن
46
در مورد پریدن صفر. بله این مسأله وجود داره. 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
باشه.
 

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])
 

firebird

Registered User
تاریخ عضویت
2 جولای 2005
نوشته‌ها
1,424
لایک‌ها
10
سن
46
خوب قبول كه بايد تريتب رو حفظ كنم و از بزرگ به كوچيك بنويسم ولي خوب همين شرايط براي سه گروه اول 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])
برای اینكه تو عبارت تست شما (12.159.46.20) اونا با 2 شروع نمیشن.
 

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 ميپره ولي در مورد سه گروه اول هيچ مشكلي نيست. چرا؟
 
بالا