PDA

View Full Version : سوال: تشریح برخی الگوهای عبارات منظم؟



one hacker alone
شنبه 19 اسفند 1391, 03:06 صبح
با یاد خدا
با سلام خدمت دوستان
من با الگوی زیر در خط اول مشکل دارم ممنون میشم یکی توضیح بده


<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[1];

// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

اول اینکه چرا بین @ گذاشته بعد دلیل وجود i اون اخر چیه بعد قبل از شروع http چرا ؟: گذاشته؟ و واحد دوم پرانتز برا چیه؟

eshpilen
شنبه 19 اسفند 1391, 10:37 صبح
اول اینکه چرا بین @ گذاشته
چون عبارت منظم رو باید بین دو کاراکتر یکسان محصور کنید.
این کاراکتر دلخواه است، میتونه @ باشه، میتونه / باشه (معمولا اسلش استفاده میکنن).
البته من جزییاتش یادم نیست و رفرنس ندارم؛ شاید هر کاراکتری نشه. فعلا در همین حد بدونید که فقط نقش محصور کردن عبارت منظم رو داره. ضمنا اون چیزهایی که بعد از کاراکتر انتهایی میان بعنوان آپشن های مخصوص به انجین رگولار اکسپرشن استفاده میشن.


بعد دلیل وجود i اون اخر چیه
i یک آپشن هست (البته من میگم آپشن، اسم فنیش شاید چیز دیگه ای باشه) که به انجین پردازش رگولار اکسپرشن میگه که عبارت منظم رو بصورت case insensitive (غیر حساس به بزرگی و کوچکی حروف) اجرا بکنه.


بعد قبل از شروع http چرا ؟: گذاشته؟
عبارت های داخل پرانتز اگر در رشتهء مورد بررسی مچ (Match) بشن، یک شماره بهشون اختصاص داده میشه که در جاهای دیگر میشه از این شماره برای ارجاع به این زیررشته های مچ شده استفاده کرد. اما بعضی وقتا تنها میخوایم بخاطر دسته بندی و مثلا مشخص کردن تعداد یک زیررشته (که بلافاصله بعد از پرانتز مشخص میکنیم)، از پرانتز استفاده کنیم، و نمیخوایم به زیررشتهء مچ شده توسط الگوی داخل اون پرانتز شمارهء ارجاع اختصاص داده بشه، در این موارد با قرار دادن ‎?:‎ بعد از پرانتز اول مشخص میکنیم که این پرانتز نیازی به اختصاص شمارهء ارجاع نداره.
ضمنا این زیر رشته های داخل پرانتز که بهشون شمارهء ارجاع داده میشه، در خروجی توابع رگولار اکسپرشن هم در یک آرایه قابل دسترسی هستن. یعنی شما میتونید بفهمید زیررشتهء مچ شده با عبارت داخل هر پرانتز دقیقا چی بوده. با شمارهء ارجاع هم میشه این زیررشته ها رو در جاهای مختلفی منجمله داخل خود رگولار اکسپرشن استفاده کرد.

http://www.php.net/manual/en/regexp.reference.subpatterns.php


و واحد دوم پرانتز برا چیه؟
واحد دوم پرانتز؟
متوجه نشدم!
آهان علامت ؟ بعد از پرانتز دوم رو میگید؟ اون به معنای اینه که عبارت داخل پرانتز میتونه حداقل صفر بار و حداکثر یک بار در اون مکان از رشته وجود داشته باشه؛ یعنی به زبان عامیانه میگه، این زیررشته میتونه باشه یا نباشه!
در این معنا علامت ؟ با عبارت مشخص کنندهء تعداد {0,1} یکسان است و هر دو میتونن بجای هم استفاده بشن.

http://www.php.net/manual/en/regexp.reference.repetition.php

one hacker alone
شنبه 19 اسفند 1391, 13:30 عصر
پرانتز دوم چی رو میگه؟

eshpilen
شنبه 19 اسفند 1391, 13:33 عصر
پرانتز دوم میگه حداقل یک کاراکتر غیر از اسلش (و حداکثر هم بطور ضمنی نامحدود).
بعد این کاراکترها رو بنابراین تا برسه به اسلش شامل میشه.
این پرانتز این زیررشتهء بدست اومده رو به اصطلاح کپچر میکنه (برخلاف پرانتز اول که گفتیم این کار رو نکنه) که بعد میشه از طریق آرایه خوندنش (‎$matches[1]‎).

iner30
شنبه 19 اسفند 1391, 15:33 عصر
دوستان یک رشته دارم که یه کد داخلش هست و میخوام اون رو با تابع preg_replace برش دارم

<!-- (هر چیزی میتونه باشه ) -->

حالا این کدی که من نشوتم کجاش اشکال داره؟

preg_replace("#(/<!--/)(.*)(/-->/)#","",$a);

iner30
شنبه 19 اسفند 1391, 16:19 عصر
preg_replace("/<!--(.*)-->/","",$a);

کد رو اصلاح کردم ولی یه مشکل ایجاد میشه
اونم اینکه مثلا اگه 5 خط داشته باشیم که خط دوم به بعد اون مقداری که باید حذف بشه رو داشته باشه ، کل خط رو حذف میکنه و آخر کار فقط خط اول رو نمایش میده و خط آخر

desatir7316
شنبه 19 اسفند 1391, 20:25 عصر
ببین این به دردت می خوره عزیز (http://barnamenevis.org/showthread.php?233318-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D9%85%D9%84-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%85%D9%86%D8%B8%D9%85(RegularExpressions)-%D8%AF%D8%B1-PHP)

iner30
شنبه 19 اسفند 1391, 22:10 عصر
این کد رو هم با استفاده از همین آموزش که شما الان فرستادین زدم
ولی خب بازم مشکل دارم

desatir7316
یک شنبه 20 اسفند 1391, 08:17 صبح
سلام
اینو پیدا کردم که اگه یه رشته مثل زیر بهش بدی تا آخر رشته نمی ره

<!--any-->thing-->
حالا اگه U رو برداری تا آخر جمله ادامه می ده یعنی عبارت منظمتو به این شکل در بباری:

$regexp = '/<!--(.*)-->/i';
یا می تونی u رو با حروف کوچیک بهش اضافه کنی، اینجوری:

$regexp = '/<!--(.*)-->/ui';

اینم از کدش:


$regexp = '/<!--(.*)-->/Ui';
if (preg_match($regexp, '<!--anything-->',$result)){
var_dump($result[1]);
}else{
print 'error';
}

iner30
یک شنبه 20 اسفند 1391, 12:47 عصر
Ui چیکار میکنه؟

desatir7316
یک شنبه 20 اسفند 1391, 14:25 عصر
u رو که گفتم، اگه با حروف بزرگ بنویسیش یعنی اینکه به اولین <-- که رسیدی ولی اگه ننویسی یا با حروف کوچیک بنویسی یعنی تا آخرین <-- ادامه بده
i هم یعنی بین حروف کوچیک و بزرگ فرق نذار، البته اینجا کاربردی نداره چون کاراکتر های <>!- که حروف و کوچیک و برزگ ندارن

حالا درست کار کرد؟

iner30
یک شنبه 20 اسفند 1391, 15:33 عصر
آره U رو گذاشتم درست کار کرد
مرسی

desatir7316
یک شنبه 20 اسفند 1391, 16:16 عصر
سلام
می شه این عبارت باقاعده رو کسی کامل توضیح بده که چی کار می کنه؟


'/[\/\\\]/'

ممنون

desatir7316
یک شنبه 20 اسفند 1391, 17:11 عصر
فکر کنم منظور / یا \ باشه
درسته؟
\\\ منظورش \ هست ؟