PDA

View Full Version : سوالاتی در مورد regex کردن



olampiad
دوشنبه 20 مرداد 1393, 18:44 عصر
سلام و خسته نباشید ب اساتید عزیز
من میخوام مفهوم regex کردن رو یاد بگیرم.
تو سایته ای دیگر و google و .. مقالاتی میخونم و یا میگیرم
حالا بعضی از سوالاتم رو که نامفهومه رو اینجا میپرسم
ممنون

سوال اول
مفهوم علامت * در regex کردن چیست؟
تو سایت ها اینو واسش تعریف کردن این کاراکتر به معنی صفر تکرار یا بیشتر است.
من مثال هارو هم نگا کردم ولی چیزی دستم رو نگرفت.
میشه ی توضیحی بدید که قانع بشم
ممنون

olampiad
دوشنبه 20 مرداد 1393, 19:52 عصر
به این کد ی نگا بندازید


preg_match_all("|href=\"(.*)?\"|U",$link,$out);

چند تا سوال داشتم در این مورد
سوال اول:
تو عبارات بی قاعده حرف | مگه معنی یا or نمیده
مگه این حرف بین دو تا مقدار قرار نمگیره
الآن چرا ابتدای مقدار قرار گرفته.

سوال دوم:
به این عبارت ی نگا بندازید
(.*)
ببینید من عبارت بالارو درست معنی میکنم
هر عبارتی که ب تعداد صفر یا بیشتر از صفر درون "" باشد.
در کل هرچیزی که درون "" باشد را برمیگرداند.

سوال سوم

تواینجا
|U چ کاربردی داره؟

ممنون بابت راهنمایی ها

Mohammadsgh
دوشنبه 20 مرداد 1393, 20:06 عصر
1-با اونی که شما تو ذهنته فرق داره و معنیش یه چیز دیگست

olampiad
دوشنبه 20 مرداد 1393, 20:31 عصر
سلام و خسته نباشید
به این دو تا تعریف ی نگا بندازید
* = یعنی آیتم قبلی صفر بار یا بیشتر تکرار شده باشد
+ = یعنی آیتم قبلی یک بار یا بیشتر تکرار شده باشد

اینا رو از روی مقالات ترجمه شده میخونم
من منظور اینا رو نمیفهمم.
آخه یعنی چی؟
منظورشون از تکرار دقیقا چیه؟
ممنون

olampiad
دوشنبه 20 مرداد 1393, 21:39 عصر
1-با اونی که شما تو ذهنته فرق داره و معنیش یه چیز دیگست

ممنون
میشه بگید معنیش چیه؟

Tarragon
دوشنبه 20 مرداد 1393, 21:46 عصر
سلام
من به شخصه از سایت regexr.com برای تست regex هام استفاده می کنم.
بنظر من می تونید با تمرین بهتر یاد بگیرید.
خود سایت تو مثالهاش کامل همه چیز رو توضیح داده.
در مورد * و + اینکه مثلا شما می خواید بگید بین "" حتما چیزی باشه یعنی خالی نباشه شما تو pattern بالا اگر بجای .* بزارید .+ دیگه اگر بین "" چیزی نباشه چیزی بر نمی گردونه .(در حالت قبل یک رشته null بر می گردوند.)

bagherok
سه شنبه 21 مرداد 1393, 09:48 صبح
به این کد ی نگا بندازید


preg_match_all("|href=\"(.*)?\"|U",$link,$out);

چند تا سوال داشتم در این مورد
سوال اول:
تو عبارات بی قاعده حرف | مگه معنی یا or نمیده
مگه این حرف بین دو تا مقدار قرار نمگیره
الآن چرا ابتدای مقدار قرار گرفته.

سوال دوم:
به این عبارت ی نگا بندازید
(.*)
ببینید من عبارت بالارو درست معنی میکنم
هر عبارتی که ب تعداد صفر یا بیشتر از صفر درون "" باشد.
در کل هرچیزی که درون "" باشد را برمیگرداند.

سوال سوم

تواینجا
|U چ کاربردی داره؟

ممنون بابت راهنمایی ها




سوال اول:
اینجا شروع و پایان عبارت منظم رو مشخص میکنه. Delimiter محدود کننده ,محصور کننده ,..
هرچیزی میتونه باشه به جز حروف الفبا, فاصله و بک اسلش.مثلا | # و...

سوال سوم:
به معنی غیر حریصانه.تو مثال زیر بهتر متوجه میشید

لینک زیر رو درنظر بگیرید

<a href="index.php" class="">123</a>
وعبارت منظم زیر

preg_match_all("|href=\"(.*)\"|",$link,$out);

خروجی:

Array
(
[0] => Array
(
[0] => href="index.php" class=""
)

[1] => Array
(
[0] => index.php" class="
)

)

حالا این عبارت منظم با U

preg_match_all("|href=\"(.*)\"|U",$link,$out);
خروجی

Array
(
[0] => Array
(
[0] => href="index.php"
)

[1] => Array
(
[0] => index.php
)
)


U به معنی غیر حریصانه است .چون ما گفتیم هرچیزی میتونه بیاد حتی دابل کوتیشن و بعد گفتیم آخرش دابل کوتیش باشه پس وقتی به اولین دابل کوتیش بعدازاین (*.) میرسه باز ادامه میده چون دابل کوتیش همه جز همه چی هستش تا آخرین دابل کوتیش برسه.این میشه حریصانه.

اما وقتی U میذارم یعنی غیر حریصانه .یعنی به اولین دابل کوتیش بعداز(*.) رسیدی دیگه ادامه نده.

معادل عبارت بالا بدون U میشه این

preg_match_all("|href=\"([^"]+)\"|",$link,$out);

هرچیزی که با
"=href
شروع میشه وبعد هرچیزی میتونه بیاد به جز دابل کوتیشن.

خروجی
Array
(
[0] => Array
(
[0] => href="index.php"
)

[1] => Array
(
[0] => index.php
)

)

olampiad
سه شنبه 21 مرداد 1393, 09:54 صبح
سلام
ب این کد ی نگا بندازید


$str=' is firstttt am nosecond ';
preg_match_all('/\bam\b/',$str,$ok);
print_r($ok);



تو اینجا کار برد b یعنی اولش با a شروع بشه و آخرش با m تموم شه.
آیا درسته؟


حالا ب این کد ی نگا بندازید


$str=' is firstttt am yes nosecond ';
preg_match_all('/\bys\b/',$str,$ok);
print_r($ok);



این کد چرا null برمیگردونه من که گفتم از y شروه بشه و ب s ختم بشه؟
چرا null بر میگردونه.
ممنون

bagherok
سه شنبه 21 مرداد 1393, 10:39 صبح
سلام
ب این کد ی نگا بندازید


$str=' is firstttt am nosecond ';
preg_match_all('/\bam\b/',$str,$ok);
print_r($ok);



تو اینجا کار برد b یعنی اولش با a شروع بشه و آخرش با m تموم شه.
آیا درسته؟


با y شروع و به s ختم بشه

y.*s


$str=' is firstttt am yes nosecond ';
preg_match_all('/\bys\b/',$str,$ok);
print_r($ok);



این کد چرا null برمیگردونه من که گفتم از y شروه بشه و ب s ختم بشه؟
چرا null بر میگردونه.
ممنون


نه
-

b\
Any word boundary

هرکلمه ای که تو این مرز باشه

شما گفتید فقط بگرد دنبال کلمه ys



یه مثال از کاربرد boundary

$str=' 4 44 444 a44 444a44 ';
preg_match_all('/\b44\b/',$str,$ok);
Array
(
[0] => Array
(
[0] => 44
)

)



$str=' 4 44 444 a44 444a44 ';
preg_match_all('/44/',$str,$ok);

Array
(
[0] => Array
(
[0] => 44
[1] => 44
[2] => 44
[3] => 44
[4] => 44
)

)





$str=' is firstttt am yes nosecond ';
preg_match_all('/y.*s/',$str,$ok);


Array
(
[0] => Array
(
[0] => yes
[1] => yenos
)

)

olampiad
سه شنبه 21 مرداد 1393, 12:08 عصر
سلام و خسته نباشید
ب این کد من ی نگا بندازید
مشکلش کجاست؟



$str='<div> hello </div>';
preg_match_all('/<([a-z]*)>.*</\1>/',$str,$ok);
print_r($ok);



من این کد رو نوشتم تا ب تگ دسترسی داشته باشم ولی ارور میده.
مشکل کد کجاست؟
ممنون بابت راهنمایی ها

olampiad
سه شنبه 21 مرداد 1393, 12:44 عصر
تشکر فراوان بابت راهنمایی ها
باور کنید خیلی راه افتادم نسبت ب چند روز پیش
واقعا خیلی لطف میکنید ب سوالاتم جواب میدید.
ممنون بابت راهنمایی ها

2undercover
سه شنبه 21 مرداد 1393, 13:07 عصر
پیشنهاد می کنم این Cheat Sheet رو هم مطالعه کنید. خالی از لطف نیست.

122191

2undercover
سه شنبه 21 مرداد 1393, 13:12 عصر
سلام و خسته نباشید
ب این کد من ی نگا بندازید
مشکلش کجاست؟



$str='<div> hello </div>';
preg_match_all('/<([a-z]*)>.*</\1>/',$str,$ok);
print_r($ok);



من این کد رو نوشتم تا ب تگ دسترسی داشته باشم ولی ارور میده.
مشکل کد کجاست؟
ممنون بابت راهنمایی ها

چون شما برای مشخص کردن شروع و انتهای (Delimiter) از / استفاده کردید، اگر می خواید از این کاراکتر توی عبارت استفاده کنید باید اون رو Escape بکنید.


/<([a-z]*)>.*<\/\1>/

olampiad
سه شنبه 21 مرداد 1393, 22:58 عصر
سلام و خسته نباشید
تشکر فراوان از دوستان عزیز بابت راهنمایی هاشون
وقعا خیلی راه افتادم.
ممنونم.
حالا ی سوال دیگه داشتم
ب این کد من ی نگا بندازید.


preg_match("#<strong>Competition Year</strong> (.*?<strong>Member</strong>) (.*)?(.*?<strong>Skill</strong>) - (.*)?(</p>)#Usi",$file,$info);


تو اینجا مفهوم - چیست؟
این حرف مگه داخل [] به معنی تا نمی باشد.
نو اینجا چ معنی دارد؟
سایتی رو میشناسید که چنین مثال هایی رو داشته باشه و من ازش الگو بگیرم.
ممنون

asonline
چهارشنبه 22 مرداد 1393, 07:21 صبح
دوست عزیز به نظرم حتما آموزش زیر را به طور کامل بخوان تا یاد بگیری
http://webgoo.ir/154/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A8%D8%A7-%D9%82%D8%A7%D8%B9%D8%AF%D9%87-regular-expressions