امروز چهارشنبه ۱۴۰۰/۰۱/۲۵

2021/04/14 GMT +4:30

» آموزش کاربردی عبارات با قاعده (Regular Expressions)

web-regular-expressions

یکی از پیچیده ترین و در عین حال پرکاربردترین مباحث در زبان های برنامه نویسی، بحث نحوه نوشتن و استفاده از عبارات با قاعده یا همان Regular Expressions است، متاسفانه با وجود کاربرد زیاد این مبحث (چه در برنامه نویسی وب و چه سایر موارد مشابه)، شاید به دلیل پیچیدگی های زیاد، کمتر به آموزش های جامع، کاربردی و قابل فهم برای همه برخورده ایم و در اغلب موارد به ذکر قواعد کلی و پراکنده اکتفا یا مباحث خیلی تخصصی ارائه شده اند که از حوصله و توان مخاطب خارج است، به هر صورت به جهت اهمیت موضوع برآن شدیم تا در مطلبی حتی الامکان مختصر اما کاربردی، همراه با مثال هایی از زبان های PHP، JavaScript و... این قواعد را با همدیگر از مقدمات در حد رفع نیاز و آشنایی فرا بگیریم، لذا اگر علاقمند به کسب اطلاعات بیشتر در این خصوص هستید، با ادامه مطلب همراه ما باشید.

مفهوم عبارات با قاعده


اگر بخواهیم یک تعریف مختصر از عبارات با قاعده یا Regular Expressions (و به اختصار Regex) در دنیای کامپیوتر و برنامه نویسی ارائه کنیم، می توان گفت روش ها و قواعدی هستند که برای استخراج یا بررسی وجود قسمت یا توالی خاصی از یک مقدار (عددی، متنی و...) به کار می روند، در واقع این قواعد بر مبنای قوانین خاصی، بخش بخصوصی از یک متن یا عدد و... را با توجه به تنظیمات ما استخراج می کنند که در محاسبات دقیق و پیچیده بسیار کاربرد خواهد داشت.
نکته: استفاده از عبارات با قاعده معمولا در چارچوب های مشخصی که توانایی پردازش آنها را داشته باشند انجام می شود، به طور مثال در توابع خاص، دستورات htaccess، قسمت جستجوی برنامه هایی که از این قواعد پشتیبانی می کنند و...؛ به عبارت دیگر صرف قرار دادن مستقیم این قواعد در کدنویسی نتیجه خاصی ندارد.

عبارات با قاعده چگونه نوشته می شوند؟


پس از آشنایی با مفهوم Regular Expressions، سوالی که به ذهن می رسد این است که عبارات با قاعده چگونه نوشته می شوند؟ در پاسخ باید گفت که دستورات در این روش از طریق توالی علامت ها، کلمات، حروف یا کاراکترهای خاصی (مانند [] () + \ *? | , w \W\ 0-9 a-z و...) که هر کدام مفهوم ویژه ای دارند، تعریف می شوند، در واقع از کنار هم قرار گرفتن این علامت ها، دستور ویژه ای شکل گرفته و قسمت خاصی از رشته مورد نظر استخراج یا بررسی می شود، چند مثال کاربردی:
- بررسی وجود یک کلمه خاص در یک رشته متنی در PHP
فرض کنید می خواهیم وجود کلمه php را در متن "php is easy and powerful" بررسی کنیم، در این صورت با استفاده از تابع preg_match خواهیم نوشت:
<?php
$str = 'php is easy and powerful';
echo preg_match('/php/', $str);
?>
خروجی کد بالا برابر با 1 خواهد بود، البته 1 در اینجا یعنی کلمه مورد نظر در عبارت وجود دارد (1 معادل TRUE است)، حال اگر کلمه php را با حروف بزرگ در دستور بالا قرار دهیم، نتیجه صفر خواهد بود، مگر اینکه یک کاراکتر با قاعده (در ادامه خواهیم دید که این کاراکتر را modifier یا تغییر دهنده می نامند) دیگر به دستورمان اضافه کنیم که بزرگ یا کوچک بودن حروف را نادیده بگیرد، این کاراکتر حرف i به معنی incasesensitive یا غیر حساس به حروف بزرگ و کوچک است:
<?php
$str = 'php is easy and powerful';
//echo preg_match('/PHP/', $str); //نتیجه 0 خواهد بود
echo preg_match('/PHP/i', $str); //نتیجه 1 خواهد بود
?>
- بررسی یک رشته متنی برای حرف a-z و اعداد 0-9 در JavaScript
در این مثال می خواهیم رشته متنی را در JavaScript بررسی کنیم و ببینیم آیا تنها شامل حروف a-z، اعداد 0-9 و فضای خالی است یا خیر، خواهیم نوشت:
<script type="text/javascript">
var str = 'Regex is so Simple!!';
var reg = /^[0-9A-Za-z ]*$/;
if(reg.test(str)){
    alert('مقادیر معتبر است');
}
else{
    alert('مقادیر معتبر نیست');    
}
</script>
کد بالا پیام "مقادیر معتبر نیست" را نمایش خواهد داد، دلیل آن وجود دو علامت !! در رشته متنی است، برای اینکه کاراکترهای مجاز بیشتری به مقایسه عبارات با قاعده اضافه کنیم، کد بالا را به شکل نمونه زیر تغییر می دهیم:
<script type="text/javascript">
var str = 'Regex is so Simple!!';
var reg = /^[0-9A-Za-z!&@\.\$%\\\-,\(\):;` ]*$/;
if(reg.test(str)){
    alert('مقادیر معتبر است');
}
else{
    alert('مقادیر معتبر نیست');    
}
</script>
نکته: در دستورات چند کاراکتر خاص مانند ^، $، *، + و... را ملاحظه می کنید که در ادامه به صورت جزئی تر در مورد آنها خواهیم گفت.
- نوشتن یک RewriteRule در htaccess
فرض کنید لینک داینامیکی به صورت index.php?user=2740 داریم که می خواهیم با استفاده از mod rewrite در htaccess آن را به صورت user/2740 دریافت کنیم، در این صورت در فایل htaccess خواهیم نوشت:
RewriteEngine On
RewriteRule ^user/([0-9]+) /index.php?user=$1 [NC,L]
ملاحظه می کنید که در اینجا نیز عبارات با قاعده بسیار کاربرد دارند.

مفهوم و کاربرد کاراکترهای دستورات با قاعده


همان طور که دیدیم، دستورات در عبارات با قاعده با استفاده از حروف و کاراکترهای خاصی که در صفحه کلید کامپیوترمان وجود دارد نوشته می شوند، اما مسلما بدون رعایت اصول خاص (syntax) و درک مفهوم این کاراکترها، عملا از نوشتن یا تفسیر صحیح این دستورات ناتوان خواهیم بود، لذا در ادامه به صورت موردی با این موارد و کاربرد آنها آشنا خواهیم شد.

حروف (لاتین)


اولین و ساده ترین مواد اولیه ای که در یک دستور Regex به کارمان می آید حروف ...abcd هستند، یعنی با قرار دادن آنها در یک دستور با قاعده، توالی از رشته متنی که شامل این کاراکترها باشد، انتخاب می شود، مثال:
<?php
$str = 'abcdefg';
$check = preg_match('/abc/', $str);
echo $check;
?>
خروجی کد بالا عدد 1 خواهد بود، چون توالی عبارت abc در رشته abcdefg وجود دارد.
نکته: الزامی به رعایت ترتیب الفبایی نیست، مهم این است که توالی قسمت Regex در رشته متنی وجود داشته باشد.

اعداد


اعداد 0 تا 9 و ترکیب آنها، دومین موادی است که می توانیم در یک دستور با قاعده از آنها استفاده کنیم، کاربرد ساده این کاراکترها مانند مثالی است که پیش تر ملاحظه کردیم:
<?php
$str = '314276539';
$check = preg_match('/427/', $str);
echo $check;
?>
که خروجی برابر 1 خواهد بود.

کاراکتر . (هر کاراکتری)


کاراکتر بعدی که در عبارات با قاعده کاربرد دارد، نقطه یا dot است که به معنی هر کاراکتری (به جزء خط جدید) است، به طور مثال:
<?php
$str = 'Regex is not too difficult!';
$check = preg_match('/Re.ex/', $str);
echo $check;
?>
خروجی کد بالا عدد 1 خواهد بود، اگرچه ما در دستور با قاعده از عبارت Re.ex استفاده کرده ایم، اما همان طور که گفتیم، نقطه در این دستورات شامل هر کاراکتری (به جزء خط جدید) می شود.
نکته: زمانی که بخواهیم کاراکتر نقطه از حالت دستوری (یعنی حالتی که شامل همه کاراکترها می شود) خارج و صرفا در نقش یک حرف (در نقش نقطه یا به اصطلاح literal) ظاهر شود، باید با یک بک اسلش (\) آن را درج کنیم، به این صورت اثر آن به عنوان یک کاراکتر دستوری از دست می رود، مثال:
<?php
$str = 'Regex is not too difficult!';
$check = preg_match('/Re\.ex/', $str);
echo $check;
?>
که کد بالا خروجی 0 را چاپ می کند، چون .\ تنها شامل خود نقطه می شود نه کاراکتر دیگری (به عبارت دیگر اگر در رشته متنی، Regex برابر Re.ex بود، بررسی بالا عدد 1 را چاپ می کرد).

کاراکتر [ ] (دست کم یک کاراکتر)


قلاب، کروشه یا bracket کاراکتر دیگری است که در دستورات با قاعده بسیار کاربرد دارد، این کاراکتر در حالت دستوری جزء علامت های محدود ساز است و تنها کاراکترهای خودش را شامل می شود (در حالت عادی حساس به حروف بزرگ و کوچک)، به فرض [a] تنها شامل رشته ای می شود که دست کم حرف a در آن به کار رفته باشد، چند نمونه از کاربرد این علامت:
[a] - شامل رشته ای می شود که دست کم a در آن به کار رفته باشد، مانند abcd، bacd، aaab و... (به طور مثال شامل bcd، 123، bbbb و... نمی شود).
[zxn] - شامل رشته ای می شود که دست کم z یا x یا n در آن به کار رفته باشد، مانند zxn، regex، zend و... (به طور مثال شامل ZXN، abc، 123 و... نمی شود).
[a-z] - شامل رشته ای می شود که دست کم حروف a تا z (الفبای انگلیسی با حروف کوچک) در آن به کار رفته باشد، مانند Php، javascript، Bbbb و... (به طور مثال شامل 1@2،  JAVASCRIPT، 123 و... نمی شود).
[A-Z] - شامل رشته ای می شود که دست کم حروف A تا Z (الفبای انگلیسی با حروف بزرگ) در آن به کار رفته باشد، مانند PHP، JavaScript، BBBB و... (به طور مثال شامل abc، 123، aa و... نمی شود).
[0-9] - شامل رشته ای می شود که دست کم اعداد 0 تا 9 در آن به کار رفته باشد، مانند 49CC، 222، b123 و... (به طور مثال شامل abcd، p%@&*، aa و... نمی شود).
[abct-z] - شامل رشته ای می شود که دست کم حرف a یا b یا c یا t تا z در آن به کار رفته باشد (دقت کنید که در اینجا چون توالی حروف انگلیسی بهم خورده است، علامت - از حرف t به بعد را شامل می شود)، مانند You، bb، abc و... (به طور مثال شامل Yo، 142، de و... نمی شود).
نکته 1: همان طور که در دستورات بالا ملاحظه کردید، علامت - یک کاراکتر همراهی کننده در عبارات با قاعده (یعنی در کنار سایر علامت ها استفاده می شود) و به معنی "تا" است.
نکته 2: علامت - در صورتی که در ابتدا یا انتهای دستور قرار گیرد، خاصیت دستوری خود را از دست می دهد، به طور مثال [az-] شامل a یا z یا علامت - می شود (همچنین [-az]).
نکته 3: علامت [ یا ] چنانچه بلافاصله بعد از اولین قلاب قرار گیرد، حالت دستوری خود را از دست می دهد، به طور مثال [zxn[] شامل z یا x یا n و یا علامت [ می شود.

کاراکتر [ ^] (به جزء کاراکتر)


در کنار کاراکتر قلاب، کاراکتر قلاب و علامت ^ وجود دارد که برعکس حالت معمول، به معنی هر کاراکتری به جزء آنچه درون قلاب تعریف شده است می باشد، به فرض [a^] شامل رشته ای می شود که به جزء حرف a، کاراکتر دیگری در آن باشد (اگر تنها حرف a باشد، نتیجه FALSE خواهد بود)، یا [acd^] شامل رشته ای می شود که به جزء حروف a و c و d، کاراکتر دیگری نیز داشته باشد، به چند مثال توجه کنید:
[a^] - شامل رشته ای می شود که به جزء a، کاراکتر دیگری در آن به کار رفته باشد، مانند abcd، bacd، aaab و... (به طور مثال شامل aaaa، a، aa و... نمی شود).
[zxn^] - شامل رشته ای می شود که به جزء z و x و n، کاراکتر دیگری در آن به کار رفته باشد، مانند ZXN، regex، zend و... (به طور مثال شامل zxn، xnnn، zzz و... نمی شود).
[a-z^] - شامل رشته ای می شود که به جزء حروف a تا z (الفبای انگلیسی با حروف کوچک)، کاراکتر دیگری در آن به کار رفته باشد، مانند Php، Javascript، bbbb1 و... (به طور مثال شامل php، javascript، bbbb و... نمی شود).
[A-Z^] - شامل رشته ای می شود که به جزء حروف A تا Z (الفبای انگلیسی با حروف بزرگ)، کاراکتر دیگری در آن به کار رفته باشد، مانند Php، JavaScript، BBBb و... (به طور مثال شامل PHP، JAVASCRIPT، BBBB و... نمی شود).
[0-9^] - شامل رشته ای می شود که به جزء اعداد 0 تا 9، کاراکتر دیگری در آن به کار رفته باشد، مانند 49CC، 22%، b123 و... (به طور مثال شامل 000، 222، 123 و... نمی شود).
[abct-z^] - شامل رشته ای می شود که به جزء حرف a و b و c و t تا z (با حروف کوچک)، کاراکتر دیگری در آن به کار رفته باشد، مانند You، b&b، ab1c و... (به طور مثال شامل u، bb، abc و... نمی شود).
نکته: به حساس بودن دستورات به حروف بزرگ و کوچک دقت کنید.

کاراکتر ^ (شروع)


علاوه بر استفاده از کاراکتر ^ (hat) در درون قلاب، این کاراکتر به تنهایی نیز در دستورات مربوط به عبارات با قاعده کاربرد فراوان دارد، علامت ^ (خارج از قلاب و در شروع دستور) به معنی نقطه شروع یک رشته است، به طور مثال دستور bcd^ به معنی هر عبارتی است که از ابتدا با bcd شروع شده باشد، لذا رشته bcde را شامل می شود، اما abcd را خیر (چون عبارت اول دقیقا با bcd شروع شده اما عبارت دوم با abc)، چند مثال:
<?php
$str = 'php is easy and powerful!';
$check = preg_match('/^php/', $str);
echo $check;
?>
خروجی دستور بالا برابر 1 یا TRUE خواهد بود، چون عبارت دقیقا با php شروع شده، اما اگر مثال به صورت زیر بود:
<?php
$str = 'why php is easy and powerful?!';
$check = preg_match('/^php/', $str);
echo $check;
?>
خروجی برابر 0 یا FALSE خواهد بود، چون در دستور تنها رشته ای را در نظر گرفته ایم که از شروع با عبارت php باشد، در حالی که شروع رشته ما با عبارت فرضی why است.
نکته: همان طور که پیش از این ملاحظه کردید، کاربرد علامت ^ درون قلاب با حالت عادی متفاوت است.

کاراکتر $ (پایان)


در کنار علامت ^ (نقطه شروع رشته)، از علامت $ (dollar) برای تعیین نقطه پایان یک عبارت استفاده می شود، به طور مثال دستور $bcd به معنی هر عبارتی است که در انتها به bcd ختم شود، لذا رشته abcd را شامل می شود، اما bcde را خیر (چون عبارت اول دقیقا به bcd ختم شده اما عبارت دوم به cde)، چند مثال:
<?php
$str = 'PHP for Web';
$check = preg_match('/Web$/', $str);
echo $check;
?>
خروجی دستورات بالا عدد 1 خواهد بود، چون رشته مورد بررسی ما دقیقا به عبارت Web ختم شده، اما اگر رشته به صورت فرضی زیر بود:
<?php
$str = 'PHP for Web?!';
$check = preg_match('/Web$/', $str);
echo $check;
?>
نتیجه برابر 0 می شد، چون عبارت به web ختم نشده بلکه به علامت ?! ختم شده است.
نکته: در کدنویسی حرفه ای و پیشرفته، معمولا از ترکیب پیچده تری از این دستورات ساده استفاده می شود، اما قواعد و اصول کار به همین صورت است.

کاراکتر { } (تعداد تکرار)


در دستورات عبارات با قاعده از علامت {} (آکولاد یا brace) برای مشخص کردن تعداد تکرار یک کاراکتر استفاده می شود، به طور مثال {3}a شامل عبارتی می شود که a در آن سه بار به صورت متوالی تکرار شده باشد، به فرض aaa، عدد داخل {} اگر به صورت تکی باشد، نمایانگر تعداد حداقل تکرار متوالی است، به فرض {5} یعنی الزاما باید حداقل 5 بار متوالی یک کاراکتر تکرار شده باشد، اما اگر به صورت دو قسمتی باشد (به طور مثال {1,3})، عدد اول حداقل تکرار و عدد دوم حداکثر را نشان می دهد، یعنی حداقل 1 بار و حداکثر سه بار تکرار را شامل می شود، به مثال زیر توجه کنید:
<?php
$str = 'bbb';
$check = preg_match('/^b{1,3}$/', $str);
echo $check;
?>
خروجی مثال بالا عدد 1 خواهد بود، چون رشته با حرف b شروع شده، حرف b از یک تا سه بار در آن تکرار شده و نهایتا نیز به b ختم شده، اما اگر همین دستور را به شکل زیر تغییر دهیم:
<?php
$str = 'bbbb';
$check = preg_match('/^b{1,3}$/', $str);
echo $check;
?>
نتیجه برابر 0 خواهد بود، چرا که حرف b چهار بار متوالی در رشته تکرار شده، در حالی که در دستور ما 1,3 بار مد نظر است.
دقت کنید که علامت {} در حالت عادی تنها یک کاراکتر یا مجموعه ای از کاراکترهای قبل از خود را بررسی می کند، به طور مثال در دستور {1,3}web، تنها تکرار حرف b مورد نظر است، نه کل عبارت، به مثال زیر توجه کنید:
<?php
$str = 'webbbb';
$check = preg_match('/^web{1,3}$/', $str);
echo $check;
?>
نتیجه دستور بالا 0 یا FALSE خواهد بود، چون تکرار حرف b بین یک تا سه بار مد نظر است، اما این حرف چهار بار متوالی در رشته مورد بررسی تکرار شده است.
نکته: تعین عدد دوم در برخی زبان های برنامه نویسی مانند JavaScript اختیاری است، لذا اگر به فرض دستور را به شکل {,1}web استفاده کنید، یعنی حداقل یک و حداکثر هر تعدادی را شامل می شود (حداکثری ندارد)، مثال:
<script type="text/javascript">
var str = 'webbbb';
var reg = /^web{1,}$/;
if(reg.test(str)){
    alert('مقادیر معتبر است');
}
else{
    alert('مقادیر معتبر نیست');    
}
</script>
که پیغام "مقادیر معتبر است" را نمایش خواهد داد، چون حداکثر تکرار را تعیین نکرده ایم.

کاراکتر * (صفر تکرار یا بیشتر)


علامت * (star یا ستاره)، کاراکتر دیگری است که در عبارات با قاعده کاربرد دارد، این کاراکتر به معنی صفر تکرار یا بیشتر است، به طور مثال  *a شامل رشته ای می شود که حرف a در آن صفر بار یا به دفعات بیشتری تکرار شده باشد، یا به طور مثال دستور *ab^ شامل رشته ای می شود که با a شروع شده و حرف b در آن صفر بار یا بیشتر تکرار شده باشد، به مثال زیر توجه کنید.
<?php
$str = 'book';
$check = preg_match('/[ab]c*/', $str);
echo $check;
?>
خروجی دستور بالا برابر 1 خواهد بود، چون [ab] یعنی یا حرف a یا حرف b در رشته باشد، و در قسمت دوم دستور نیز صفر تکرار یا بیشتر حرف c مد نظر بوده که عملا تاثیری در عبارت با قاعده ما ندارد، اما اگر همین دستور به صورت زیر بود:
<?php
$str = 'book';
$check = preg_match('/[ad]c*/', $str);
echo $check;
?>
نتیجه برابر 0 یا FALSE خواهد بود، چون در قسمت اول دستور یعنی [ad]، وجود کاراکتر a یا d در رشته مد نظر است، اما چنین کاراکترهایی در book وجود ندارد.

کاراکتر + (یک تکرار یا بیشتر)


علامت + (plus یا به اضافه)، کاربردی مشابه * دارد،  با این تفاوت که در اینجا حداقل یک بار تکرار نیاز است، به عبارت دیگر این علامت نمایانگر یک بار تکرار یا بیشتر است، به طور مثال +a شامل رشته ای می شود که حداقل یک a در آن وجود داشته باشد، یا +550 شامل عددی می شود که حداقل یک صفر در آن به کار رفته باشد، به مثال زیر توجه کنید.
<?php
$str = 'web.a.55';
$check = preg_match('/^[a-z]{3}\.[abc]+\.[0-9]{1}/', $str);
echo $check;
?>
خروجی کد بالا 1 یا TRUE خواهد بود، چون بر طبق دستور مد نظر ما، رشته باید با a-z به تعداد 3 کاراکتر شروع شده، سپس یک نقطه داشته باشد و بعد از نقطه، یک یا بیشتر کاراکتر a یا b یا c داشته باشد، سپس یک نقطه و در نهایت به عدد 0 تا 9 برسد (چون از علامت $ استفاده نکرده ایم، مابقی رشته بررسی نمی شود)، اما اگر علامت $ را در انتهای دستور بالا اضافه کنیم، نتیجه 0 یا FALSE خواهد بود، چون تعداد 1 عدد در انتها مد نظر ما است، اما 55 شامل دو عدد است.

کاراکتر ? (اختیاری)


علامت ? (question mark یا سوال) در عبارات با قاعده کاربرد به خصوصی دارد، از این نشان برای اختیاری (optional) کردن کاراکتر قبل از آن استفاده می شود، به طور مثال jpe?g هم شامل jpg می شود و هم شامل jpeg، چون بعد از حرف e علامت ? قرار گرفته و لذا بود یا نبود این حرف اختیاری است، به مثال زیر توجه کنید.
فرض کنید آدرس فایلی به صورت زیر است:
../upload/image.jpg
اکنون می خواهیم نام فایل را بدون پسوند از آدرس بالا استخراج کنیم، بدین منظور پارامتر دومی به تابع preg_match اضافه کرده و Regex زیر را می نویسیم.
^\.\.\/upload\/(.*)\.jpe?g$
شکل کامل کد ما به صورت زیر خواهد بود.
<?php
$str = '../upload/image.jpg';
$check = preg_match('/^\.\.\/upload\/(.*)\.jpe?g$/', $str, $match);
echo $check;
print_r($match);
//echo $match[1];
?>
خروجی قسمت echo کد بالا عدد 1 یا مقادیر Boolean آن برابر TRUE خواهد بود، اما اگر با print_r از متغیر match (که خروجی تابع preg_match به صورت یک آرایه است) خروجی بگیریم، نتیجه به شکل زیر خواهد بود.
Array
(
    [0] => ../upload/image.jpg
    [1] => image
)
نکته 1: در عبارت با قاعده بالا، کاراکتر جدید () به کار رفته که در ادامه در مورد آن خواهیم گفت.
نکته 2: به عملکرد خنثی سازی علامت \ توجه کنید (برای خارج کردن کاراکتر . و / از حالت دستوری، از \ استفاده شده).

کاراکتر ( ) (ساخت گروه)


اگرچه علامت () (parenthesis یا پرانتز) در کاربردهای عادی مفهوم مشخصی دارد، اما این علامت در عبارات با قاعده طور دیگری تفسیر می شود و نمایانگر گروهی از توالی ها (pattern) است، به زبان ساده هر آنچه در بین () قرار گیرد به عنوان یک مجموعه دستور قابل استفاده است که در برخی توابع و دستورات به کار می رود، به طور مثال کد زیر در حالت عادی برای کلید 1 آرایه match چیزی چاپ نمی کند:
<?php
$str = 'image22.jpg';
$check = preg_match('/[a-z]+[0-9]*\.jpe?g$/', $str, $match);
echo $check;
print_r($match);
//echo $match[1];
?>
نتیجه قسمت print_r کد بالا:
Array
(
    [0] => image22.jpg
)
اما اگر همین کد را به صورت زیر ویرایش کنیم:
<?php
$str = 'image22.jpg';
$check = preg_match('/([a-z]+[0-9]*)\.jpe?g$/', $str, $match);
echo $check;
print_r($match);
//echo $match[1];
?>
خروجی قسمت print_r به صورت زیر خواهد بود:
Array
(
    [0] => image22.jpg
    [1] => image22
)
ملاحظه می کنید که دستورات داخل () به عنوان یک گروه خاص پردازش شده و نتیجه در یک کلید مجزا به خروجی ارسال شده است.
حال فرض کنید می خواهیم عدد 22 را نیز در یک کلید مجزا داشته باشیم، در این صورت از علامت () در داخل علامت () دیگر به صورت زیر گروه استفاده می کنیم:
<?php
$str = 'image22.jpg';
$check = preg_match('/([a-z]+([0-9]*))\.jpe?g$/', $str, $match);
echo $check;
print_r($match);
//echo $match[1];
?>
خروجی قسمت print_r به صورت زیر خواهد بود:
Array
(
    [0] => image22.jpg
    [1] => image22
    [2] => 22
)

کاراکتر | (یا)


اگر خاطرتان باشد گفتیم که علامت - در دستورات با قاعده به معنی "تا" است، حال می خواهیم علامت دیگری را معرفی کنیم که به معنی "یا" است، به طور مثال a|b یعنی یا a یا b، به مثال زیر توجه کنید.
<?php
$str = 'Iran is a beautiful country.';
$check = preg_match('/Iran|Tajikistan/', $str, $match);
echo $match[0]
?>
خروجی مثال بالا Iran خواهد بود، با توجه به دستور Regex اگر به جای Iran عبارت Tajikistan نیز وجود داشت، دستور معتبر بود و Tajikistan به عنوان خروجی چاپ می شد.

حروف خاص در عبارات با قاعده


تا این قسمت از آموزش، با کاراکترهای پرکاربرد در دستورات Regular Expressions آشنا شدیم، اما بخشی از مفاهیم این زبان جالب با استفاده از حروف خاصی تعریف می شود که در زیر به صورت تیتروار، لیست برخی از پر کاربردترین آنها را به همراه مثال با هم مرور می کنیم.

حرف d\


حرف d\ (حروف کوچک) به معنی هر عددی (d مخفف digit)، مثال:
<?php
$str = 'tel: +98';
$check = preg_match('/^tel: \+(\d+)/', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => tel: +98
    [1] => 98
)
نکته 1: پیش تر گفتیم که علامت \ کاراکترهای دستوری را به حالت عادی تبدیل می کند، اما در اینجا برعکس حالت قبل، علامت \ کاراکترهای عادی را به دستور تبدیل می کند (d یک حرف عادی است، اما d\ یعنی هر عددی).
نکته 2: بزرگ یا کوچک بودن حروف خاص در عبارات با قاعده، ممکن است بر روی مفهوم آنها اثرگذار باشد.

حرف D\


حرف D\ (حروف بزرگ) به معنی هر کاراکتری که عدد نباشد، مثال:
<?php
$str = 'tel: +98W50';
$check = preg_match('/^tel: \+.*(\D+).*/', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => tel: +98W50
    [1] => W
)
نکته: تمام مثال ها فرضی و صرفا جهت درک راحت تر مطالب ارائه شده اند، لذا ممکن است برخی مواقع عادی به نظر نرسند!

حرف w\


حرف w\ به معنی هر حرف الفبایی (لاتین)، مثال:
<?php
$str = 'your@email.com';
$check = preg_match('/^(\w+)@.+\.[a-z]{2,3}/', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => your@email.com
    [1] => your
)

حرف W\


حرف W\ به معنی هر کاراکتری که حرف الفبایی یا عدد نباشد، مثال:
<?php
$str = 'P21#W@RR^';
$check = preg_match('/.*(\W+).*(\W+).*(\W+)/', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => P21#W@RR^
    [1] => #
    [2] => @
    [3] => ^
)

حرف s\


حرف s\ به معنی هر فضای خالی (Whitespace)، مثال:
<?php
$str = 'Hello World!';
$check = preg_match('/(\w){1}.*\s(\w){1}.*/', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => Hello World!
    [1] => H
    [2] => W
)

حرف S\


حرف S\ به معنی هر کاراکتری که فضای خالی نباشد، مثال:
<?php
$str = 'Hello World!';
$check = preg_match('/(\S+)\s(\S+)/', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => Hello World!
    [1] => Hello
    [2] => World!
)

Modifiers در Regular Expressions


اگر به نکاتی که در خلال آموزش به صورت پراکنده به آن اشاره شد، توجه کرده باشید، سه مورد در کدهایی که تا این لحظه نوشتیم خودنمایی می کند:
- کدها به حروف بزرگ یا کوچک حساس هستند، به طور مثال [a-z] الزاما شامل حروف کوچک می شود.
- دستور . (هر کاراکتری) شامل خط جدید (line break) نمی شود، به طور مثال کد زیر عدد 0 یا FALSE را برمی گرداند:
<?php
$str = 'Reg
ex is not too difficult!'
;
$check = preg_match('/Re.ex/', $str);
echo $check;
?>
مشکل از آنجا نشات می گیرد که مقادیر متغیر فرضی str با یک خط جدید شکسته شده.
- اگر بخواهیم با علامت های ^ و $، ابتدا و انتهای رشته را مشخص کنیم، در حالتی که مقادیر رشته از چندین خط جدید تشکیل شده باشد، به مشکل بر خواهیم خورد.
راه حل مشکلات بالا در دستورات با قاعده، استفاده از تغییر دهنده ها یا Modifiers است، Modifiers چیزی نیستند جزء چند حرف خاص که در انتهای دستور قرار می گیرند و رفتار آن را تغییر می دهند.

modifier i


برای نادیده گرفتن بزرگ یا کوچک بودن حروف، از تغییر دهنده i (برگرفته از case-insensitive) استفاده می کنیم، به طور مثال:
<?php
$str = 'Hello World!';
$check = preg_match('/[a-z\s\W]*/i', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => Hello World!
)

modifier s


برای محاسبه خط جدید در هنگامی که از کاراکتر دستوری . استفاده می کنیم، تغییر دهنده s (برگرفته از single line) کاربرد دارد، مثال:
<?php
$str = 'Reg
ex is not too difficult!'
;
$check = preg_match('/Re.+ex/s', $str);
echo $check;
?>
خروجی برابر 1 یا TRUE خواهد بود.
نکته: در این حالت خود خط جدید نیز یک کاراکتر محسوب شده، لذا درج علامت + (یک تکرار یا بیشتر) بعد از . ضرورت دارد.

modifier m


برای اعمال دستورات عبارات باقاعده به صورت خط به خط، تغییر دهنده m (برگرفته از multiline) کاربرد دارد، به عبارتی استفاده از این تغییر دهنده باعث می شود تا دستور ما در رشته هدف، به جای بررسی عادی، برای هر خط به صورت جداگانه بررسی شود، مثال:
<?php
$str = 'CSS
JavaScript
PHP
HTML
MySQL'
;
$check = preg_match('/^(HTML)/m', $str, $match);
print_r($match);
?>
خروجی:
Array
(
    [0] => HTML
    [1] => HTML
)
اما اگر همین کد را بدون m استفاده کنیم، نتیجه ای نخواهیم داشت:
<?php
$str = 'CSS
JavaScript
PHP
HTML
MySQL'
;
$check = preg_match('/^(HTML)/', $str, $match);
print_r($match);
?>
خروجی:
Array
(
)
نکته: منظور از خط، در واقع همان کاراکتر (نامرئی) n\ یا r\ است.
در پایان این آموزش باید یادآور شویم که دستورات مربوط به عبارات با قاعده به موارد گفته شده محدود نمی شوند، اما برای برنامه نویسی وب دانستن همین اصول و مفاهیم پر کاربرد، لازم و تا حد زیادی کافی خواهد بود.
دسته بندی: مهارتهای وب » دانستنی ها
related مطالب بیشتر:
» لیست کدهای وضعیت HTTP و معنی خطاهای سرور
» پروتکل امن HTTPS و رمزنگاری SSL چیست؟
» حمله DDoS چیست و چگونه از آن جلوگیری کنیم؟
» چگونه با برنامه Outlook ایمیل ارسال و دریافت کنیم؟
» اصطلاحات و مفاهیمی که مدیر سایت باید بداند!
commentنظرات (۱۳۴ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: مهدی
۱۷:۰۲ ۱۳۹۲/۰۷/۲۷
سلام و ممنون بابت سایت خوبتون.
من یه سی ام اس دارم که کاربرا توش می تونن عضو بشن و توی نام کاربری هم حرف انگلیسی کوچیک و بزرگ و هم عدد می تونن تایپ کنن. چطور می تونم کاری کنم که کاربر فقط بتونه « عدد » تایپ کنه؟ این کدش هست:
preg_match('/^([a-zA-Z0-9])(([-a-zA-Z0-9_])*([a-zA-Z0-9]))*$/i');
پاسخ: 
سلام
به نظر ویرایش کد بالا به صورت زیر مشکل شما را حل خواهد کرد:
preg_match('/^([0-9])(([0-9])*([0-9]))*$/i');
نکته: کدها تست نشده اند.
نویسنده: مهدی
۱۸:۴۰ ۱۳۹۲/۰۷/۲۷
سلام. از راهنمایی تون خیلی خیلی ممنونم.
سایت من دارای فرم های زیادی هست ای کاش یه آموزش هم در مورد نکات درست کردن فرم های php قرار میدادین که چطوری از لحاظ امنیتی درستشون کنیم.
من الان می تونم فرم درست کنم مثل فرم عضویت یا فرم ارسال تیکت یا ... اما در مورد رعایت نکات امنیتی شک دارم و با نرم افزار Acunetix تست می کنم و میگه که باگ امنیتی داره که نمی دونم چطور مشکلش رو برطرف کنم.
پاسخ: 
سلام
در صورتی که باگ های پیدا شده توسط این برنامه در درجه high نیستند، معمولا مشکل خیلی جدی نیست، در مورد PHP مهم ترین فاکتور امنیت، جلوگیری از نفوذ به دیتابیس و ایمن سازی متغیرها است که خود این امر مستلزم رعایت نکات امنیتی در کدنویسی و ارتباط با MySQL است.
نویسنده: علی رضا
۰۸:۱۱ ۱۳۹۲/۰۸/۰۲
سلام. من یه سوال تخصصی داشتم که چون با تیکت قبلی ( کاربر مهدی) موضوعش یکی هست اینجا نوشتم.
من سی ام اس سایتم رو خودم طراحی کردم و الان خیلی ذهنم درگیر شده که نکنه کسی بتونه هکش کنه.
من با نرم افزار Acunetix سایتم رو چک کردم و 59 تا باگ در درجه high داشت!
همون طور که در جریان هستید خیلی از هکرها با استفاده از نرم افزارهای این چنینی باگ ها رو پیدا می کنن و روال کار این نرم افزارها هم اینه که یه موتور داره به سرعت تمامی صفحات رو چک می کنه مثلا در کمتر از 1 دقیقه حدود 100 صفحه رو چک می کنه. حالا سوال این اینجاست که آیا میشه کدی رو ساخت که اگر سایت با یه آی پی خاص در عرض یک دقیقه بیشتر از 100 بار بازدید شد اون ای پی رو به مدت معینی بلوکه کنه و اینجوری از ادامه کار این سری نرم افزارها جلوگیری کنه؟
چون من چند سایت معتبر رو خواستم با این نرم افزار چک کنم که مثلا 200 لینک رو چک می کرد بعد ارور میداد که قادر به ادامه چک کردن نیست.
ممنون میشم اگر به این سوال من جواب بدین.
پاسخ: 
سلام
بلاک کردن درخواست های مکرر در فاصله زمانی کوتاه هم از طریق فایروال سرور و هم نوشتن یک برنامه با PHP ممکن است، بحث فایروال به امنیت سرور و نرم افزارهای نصب شده در آن بر می گردد، اما برای PHP می توانید با یک منطق ساده این ابزار را طراحی کنید:
- IP درخواست کننده صفحه و زمان اولین بازدید او در دیتابیس ثبت می شود.
- در ادامه برای همه بازدیدهای بعدی، ثبت اطلاعات انجام می گیرد.
- در کنار ثبت اطلاعات تعداد بازدیدها و اختلاف اولین و آخرین (بازدید فعلی) محاسبه می شود، اگر اختلاف از مدت زمان معینی کمتر بود و تعداد بازدیدها از مقدار عادی بیشتر بود، IP در لیست سیاه قرار می گیرد!
- قاعدتا باید قبل از نمایش محتوا، این برنامه را اجرا کنیم و اگر IP مجاز بود، ادامه کدها اجرا شود.
نکته: معمولا هاست های به روز و حرفه ای، از این سیستم امنیتی استفاده می کنند و نیازی به طراحی مجدد آن نیست.
نویسنده: محمد
۱۰:۰۰ ۱۳۹۲/۰۸/۰۲
سلام برای اینکه بازدید کنندگان توی فرم تماس بتونن فقط کلمات فارسی با عدد تایپ کنن میشه این کد رو گذاشت؟
preg_match('/^([آ-ی0-9])*$/i');
پاسخ: 
برای این کار باید modifier u را به صورت نمونه زیر استفاده کنید:
<?php
$str_1 = 'متن فارسی و 0 9';
$str_2 = 'متن فارسی و a z';
if(preg_match('/^[0-9آ-ی\s]+$/u', $str_1)){
echo '1: Valid' . '<br>';
}
else{
echo '1: Invalid' . '<br>';
}
if(preg_match('/^[0-9آ-ی\s]+$/u', $str_2)){
echo '2: Valid' . '<br>';
}
else{
echo '2: Invalid' . '<br>';
}
?>
نکته: یونیکد فایل های شما باید از حروف فارسی پشتیبانی کند، به عبارتی باید فایل های خود را به صورت utf-8 ذخیره کنید.
نویسنده: محمد
۱۴:۴۱ ۱۳۹۲/۰۸/۰۳
بسیار ممنونم.
نویسنده: خلیل
۰۰:۰۷ ۱۳۹۲/۰۸/۰۴
بازم ممنون خیلی جالب بود دستتون درد نکنه خیلی چیزا یاد گرفتم .
نویسنده: علی رضا
۱۲:۲۸ ۱۳۹۲/۰۸/۰۶
با سلام مجدد خدمت شما مدیر محترم.
من توی تیکت قبلی در مورد نحوه بلوکه کردن آی پی به صورت خودکار پرسیده بودم و شما لطف کردید و راهنمایی کردین.
حالا من کد زیر رو نوشتم.
$ref = $_SERVER['HTTP_REFERER'];
$ip = $_SERVER['REMOTE_ADDR'];
$r = mysql_fetch_array(mysql_query("select * from `status` where ip = '$ip' order by id desc limit 1"));
$re = time() - $r['time'];
mysql_query("insert into status() values('$id','$ref','$time','$ip','$re')") or die(mysql_error());
حالا کد بالا اختلاف زمان هم ذخیره میکنه اما من توی نحوه کد نویسی این که چطور مثلا اگه کاربری با یه ای پی 10 بازدید با زمان کل 5 ثانیه کرد، ای پی اون به مدت 10 دقیقه بلوکه بشه و بعد دوباره بتونه از سایت بازدید کنه؟
ممنون میشم منو راهنمایی کنید.
پاسخ: 
سلام
این سیستم را باید خودتان زمان بگذارید، طرح آن را مرحله به مرحله، دقیق ترسیم کرده و عملی کنید، اما جهت راهنمایی، آنچه که در نگاه اجمالی به ذهن می رسد، ابتدا تعداد کل بازدید هایی که به فرض از 5 دقیقه پیش به بعد برای یک IP هستند را شمارش کنید، مثال:
//5 دقیقه پیش
$delay_time = time() - 300;
$query = mysql_query("SELECT COUNT(ip) FROM status WHERE time > $delay_time ORDER BY id ASC LIMIT 10")
or die(mysql_error());
while($row = mysql_fetch_array($query)){
$ips = $row['COUNT(ip)'];
}
اگر تعداد به 10 مورد رسید (یعنی این آی پی در 10 دقیقه پیش، 10 بازدید داشته)، در ادامه آخرین زمان را دریافت کنید:
if($ips == 10){
$last_visit = mysql_query("SELECT time FROM status WHERE time > $delay_time ORDER BY id ASC LIMIT 1")
or die(mysql_error());
while($row = mysql_fetch_array($query)){
$time = $row['time'];
}
}
اکنون زمان فعلی را از آخرین زمان کم کنید، اگر به فرض از 10 ثانیه کمتر بود، وضعیت آن IP را به BLOCKED تغییر دهید:
	if((time() - $time) < 10){
//کدهای مربوط به بلاک کردن آی پی
}
در ابتدای اجرای صفحات نیز ابتدا وضعیت IP را بررسی کنید که BLOCKED نباشد.
برای آزاد کردن کاربر نیز کافی است همین الگو را درک و به نحو متفاوتی آن را طراحی نمائید.
نکته: کدها ذهنی هستند و تست نشده اند.
نویسنده: علی رضا
۱۵:۵۰ ۱۳۹۲/۰۸/۰۶
از زمانی که گذاشتین و پاسخ دادین ممنونم ولی من کد بلاگ کردن آی پی دو بلد نیستم. آیا اسکریپت خاصی داره؟
شما توی کد داخل یه قسمت نوشتین که
//کدهای مربوط به بلاک کردن آی پی
اما مشکل من اینجاست که کد این قسمت رو بلد نیستم.
پاسخ: 
باید برنامه نویسی و تبدیل ایده به کد را بلد باشید، در غیر این صورت نمی توانید این سیستم را طراحی کنید، تا جایی که اطلاع داریم اسکریپت آماده برای این مورد وجود ندارد، اگر هم باشد تنها یک IP را به صورت همیشگی بلاک می کند که خیلی هوشمند نیست.
نویسنده: علی رضا
۱۶:۰۰ ۱۳۹۲/۰۸/۰۶
البته من یه نوع کد نویسی دیگه به ذهنم رسیده که فکر کنم جالبتر باشه.
اول تعداد اتصال هایی که ip خاصی در مدت زمان 10 دقیقه داشته به همراه اختلاف زمانی که بینشون هست رو بشماریم بعد اگه میانگین اختلاف زمان ها مثلا از 5 ثانیه کمتر بود ای پی رو بلاک کنیم. خیلی ممنون میشم اگه لطف کنید و کد بلاک کردن آی پی و ازاد کردن اون رو بهم بگین توی اینترنت زیاد گشتم و چیزی پیدا نکردم.
نویسنده: محمد حسین
۱۷:۱۶ ۱۳۹۲/۰۸/۰۶
با سلام ؛
ممنون از وقتی که برای ما میذارین.
ببخشید میخواستم درمورد این کدی که نوشتم کمکم کنید.
a = document.getElement ...
c = "["
d = "]"
b = a.replace(/c + text + d/gim,"text2");
همونطور که می بینید ، تو متغیر a مقدار یه عنصر مثلا یه input رو ذخیره کردم.
تو متغیر c و d هم دو عبارت رو ذخیره کردم.
من میخوام توسط متغیر b مقدار c + متن دلخواه + d رو با یه عبارت دیگه جایگذین و به اصطلاح replace کنم.
اما این اتفاق نمی افته.
یعنی من نمیدونم که چجوری باید c + متن دلخواه + d رو بنویسیم که c و d رو بصورت متغیر بخونه.
پاسخ: 
سلام
از یکی از حالت های زیر متناسب با نیازتان استفاده کنید:
a = document.getElementById(id).value;
c = "["
d = "]"
reg = new RegExp(c + text + d, 'igm');
b = a.replace(reg, "text2");
یا:
a = document.getElementById(id).value;
c = "["
d = "]"
b = a.replace(c + text + d, "text2");
نویسنده: علی رضا
۲۰:۰۱ ۱۳۹۲/۰۸/۰۶
آقا خیلی خیلی ممنونم.
نمی خواد زحمت بکشید خودم یه کد نوشتم که اصلا احتیاجی به استفاده از بلاک کردن ای پی نداشت و مشکل رو حل کرد.
این طوری کار می کنه که اگه کاربر در زمان 1 دقیقه بیشتر از 100 بار صفحه رو رفرش کرد، به صفحه دیگه ای منتقل بشه که مثل ارور 500 عمل می کنه و تا 10 دقیقه امکان مشاهده هیچ کدام از صفحات سایت رو نداره. و احتیاجی به ساخت دیتابیس با سطرهای زیاد و معادلات پیچیده ریاضی نداره.
ولی ایده اولیه رو شما دادین خیلی متشکرم.
نویسنده: صادقی
۱۸:۵۵ ۱۳۹۲/۰۸/۲۵
سلام. ممنون از آموزش خوبتون.
من می خوام که کدی درست کنم که فقط مقادیر به صورت زیر رو درست قبول کنه اما هر کاری می کنم و هر کدی رو می زنم باز ارور میده.
/asd/241
/dxafs
/sdw/svcsw
یعنی با / شروع بشه و بعد حروف یا اعداد یا / رو قبول کنه.
و هیچ کاراکتر اضافه دیگه ای رو نپذیره.
من کد
$b = preg_match('/^[\/0-9a-zA-Z]*$/', $a;
می نویسم و ارور میده. ممنون میشم کمکم کنید.
پاسخ: 
سلام
دریافت خطا به خاطر از قلم انداختن علامت '(' است!
البته دستور Regex نوشته شده نیز ایراداتی دارد، نمونه صحیح:
<?php
$a = '/sdw/svcsw';
$b = preg_match('/^[\/]+[\/0-9a-zA-Z]+$/', $a);
echo $b;
?>
نویسنده: صادقی
۱۹:۵۳ ۱۳۹۲/۰۸/۲۵
ممنون. عالی بود.
نویسنده: علی
۱۶:۴۷ ۱۳۹۲/۰۹/۰۱
بنام خدا
سلام
خیلی حال کردم با آموزشتون.
خدا قوت
کم کم 3 ساعت طول میکشه اینو بنویسید !
من خسته شدم و نخوندم ولی نویسندش آدم باحالی بوده که تونسته اینها رو بنویسه یا گردآوری کنه.
نویسنده: سعید
۱۵:۱۰ ۱۳۹۲/۰۹/۲۲
مهندس جان خیلی جامع و کامل بود.
کلاً از مطالبی که نظریه زبانها رو با برنامه نویسی مرتبط میکنه لدت میبرم.
دمت گرم.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- موارد غیرمرتبط با مباحث آموزش ها را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ مختصر داده خواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- از درج عناوین تبلیغاتی در فیلدها خودداری کنید، در صورتی که یادداشت تبلیغاتی تشخیص داده شود حذف خواهد شد.
- تمام یادداشت ها بررسی و زمانی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد خودداری کنید.





2 × 4
 refresh

آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form شریفی
در:
سلام مجدد. من یه سوال خیلی تخصصی دارم. ممنون میشم پاسخ بدین. برای پروژه پایان نامه. دارم روی موتورهای جستجوگر تحقیق میکنم. فرض...
۱۴۰۰/۰۱/۲۵

form شریفی
در:
سلام استاد. من از متد file_get_contents استفاده می کنم برای دریافت اطلاعات از سایت های مختلف. بعضی وقتها سایت ها دیر لود میشه. آیا...
۱۴۰۰/۰۱/۲۵

form hh
در:
سلام خدمت شما بنده یه سوال داشتم تمام مراحل شما رو انجام دادم و نتیجه گرفتم و لازمه یه تشکرم بکنم. وبسایت من،...
۱۴۰۰/۰۱/۲۵

form erfan
در:
سلام من واسه یه دکمه یه محتوایی تعریف کردم که وقتی کلیک شد محتوا رو نشون بده اما تو دوجاش موندم یک اینکه چیکار کنم...
۱۴۰۰/۰۱/۲۱

form mahdi
در:
سلام استاد عزیز ، بازم معذرت میخوام سوالام زیاد شد ولی همشون در یک موضوع هستن ، تونستم که با این روش برای هر اسلایدر...
۱۴۰۰/۰۱/۱۸

form mahdi
در:
سلام استاد عزیز عذر میخوام بار سومه پیام میزارم ، مشکلش از ست اینترول بود که قطع نمیشد و با هم تداخل داشتند ولی بدون...
۱۴۰۰/۰۱/۱۸

form mahdi
در:
سلام وقت بخیر استاد عزیز ، یک تابع رو چطور میشه در جاوا اسکریپت اورراید کرد؟ که مثلا با هر فراخوانی مجدد ، قبلی ها...
۱۴۰۰/۰۱/۱۸

form متین
در:
سلام چجوری برای خود صفحه ادرس بسازیم که سایتی که رو ساختیم رو با دستگاه دیگه پیداش کنیم
۱۴۰۰/۰۱/۱۶

form امیرحسین برزویی
در:
من یک وبلاگ دارم و 9 سالمه من در وبلاگم مداحی می گذارم ولی وقتی قاب گذاشتم از این سایت من دیگه فیلم...
۱۴۰۰/۰۱/۱۶

form بنده خدا
در:
سلام خسته نباشین، خدا قوت. یه سوال دارم. چرا در بخش نظردهی وبلاگ به جای عنوان پست می نویسه مطلب مورد نظر یافت نشد؟!...
۱۴۰۰/۰۱/۱۵

form روح الله
در:
موقعی میخواهم وارد سایت ایران خودرو بشم پیام میده از Ip داخلی استفاده کنید دلیلش چیست
۱۴۰۰/۰۱/۱۴

form غریب
در:
تشکر از شما مشکلم حل شد امیدوارم موفق و پیروز باشید هر جا که هستید
۱۴۰۰/۰۱/۱۱

form غریب
در:
سلام مجدد ممنون و تشکر از کمکتون کد به خوبی کار میکنه اما همچنان من مشکلی دارم که حل نتونستم کنم...
۱۴۰۰/۰۱/۱۰

form غریب
در:
سلام مجدد این کدی که دادید خوب هست ولی من بد و ناقص توضیح دادم توجه کنید کد این هست تقریبا ممنون...
۱۴۰۰/۰۱/۱۰

form غریب
در:
سلام خسته نباشید من کدی دارم که میخوام داخل یه بخشیش نتیجه یه رویداد رو فراخوانی کنم و راهش و نمیدونم اگر میشه کمک...
۱۴۰۰/۰۱/۱۰

form محسن
در:
سلام ، سوال من مربوط به پنل کارگزاری هاست ، وقتی اسم یک سهم (نماد) را در قسمت جست و جو سرچ میکنم...
۱۴۰۰/۰۱/۰۸

form ترجمه
در:
باسلام همه صفحات من دارای دو url می باشد که یکی با حروف کوچک است و دیگری با حروف بزرگ چجوری این مشکل را...
۱۴۰۰/۰۱/۰۸

form سهیل ملکی
در:
سلام خسته نباشید ببخشید من میخوام از تابع navigator.online توی جاوا اسکریپت استفاده کنم تا باهاش بفهمم کاربر آنلاین هست یا نه و اگه بود...
۱۴۰۰/۰۱/۰۴

form Rabbiten
در:
سلام. من چند ماه است که دنبال کد استایل تصویر مثل تبلیغات بالای سایت شما هستم. اما هیچ جا پیدایش نمی کنم. لطف می...
۱۴۰۰/۰۱/۰۱

form mahdi
در:
سلام استاد عزیز سال نو رو تبریک میگم بهتون ، امیدوارم که خودتون و خانوادتون همیشه سالم و سلامت باشید و امسال پر از...
۱۳۹۹/۱۲/۳۰

form korosh abbasy
در:
سلام وقت بخیر ببخشید در مورد این مطلب سوالی پرسیدم شما در مورد output buffering توضیح دادید کد کار نمیکنه میخواستم ببینم نیازی هست من...
۱۳۹۹/۱۲/۲۹

form احمد
در:
سلام مجدد عذرخواهی میکنم یه موردی دیگه بود فراموش کردم در مورد سوال هدر بگم اینکه روی لوکال به هدر ارسال میشه ولی روی هاست...
۱۳۹۹/۱۲/۲۸

form احمد
در:
با سلام خسته نباشید ببخشید قبلا یه سری دستورات جی کوری رو از خودتون گرفتم وقتی فیلدهای فرمم تکمیل شده است توسط هدر بره به...
۱۳۹۹/۱۲/۲۸

form korosh abbasy
در:
سلام دم شما گرم این دستور برای خوندن فایل هم استفاده میشه؟ من میخوام دسترسی تعیین کنم که اگر یک متغییر true...
۱۳۹۹/۱۲/۲۷

form احمد
در:
با سلام و خسته نباشید ببخشید داخل جیکوری یدونه متغییر دارم الان میخوام همین متغییر رو با یه عدد دیگه جمع کنم ولی وقتی علامت...
۱۳۹۹/۱۲/۲۶
  در انتظار بررسی: ۱
 پاسخگویی به سوالات ممکن است تا 24 ساعت زمان ببرد.