PDA

View Full Version : آموزش: دنیای رگولار اکسپرشن Regular expression



رضا قربانی
یک شنبه 05 شهریور 1391, 19:32 عصر
با سلام و خسته نباشید خدمت همگی دوستان
هدفم از ایجاد این تاپیک فقط و فقط کمک به دوستان عزیز در مورد این مبحثه .

هر کسی هر چی از کدهای Regular expression داره در اینجا قرار بده تا هم من و بقیه بچه ها از اون استفاده کنند و یک مرجع خوب بشه برای یادگیری و رفع اشکالات.

دوستان زیادی در انجمن هستند با این موضوع آشنایی دارند که شرکت در این تاپیک باعث دلگرمی ما خواهد شد.



====================

یک توضیحی برای کاربرانی که هنوز آشنایی با این موضوع ندارند:

عبارات منظم (Regular Expressions) وسیله ای را برای برنامه نویسان فراهم می کنند که بتوان به کمک آنها عبارات ، کلمه ها و الگوها ی مورد نظر را در یک رشته متنی (String) پیدا کرد.


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


Regular Expressions محدود به یک زبان خاص نیست و اکثر زبانهای برنامه نویسی این امکان را درون خود قرار داده اند . عبارات منظم توسط یک پردازنده که درون زبان برنامه نویسی وجود دارد تفسیر (interpret) می شوند .


عبارات منظم استفاده های زیادی در برنامه های کاربردی مختلف دارد . توسط بسیاری از ادیتورها (Text Editor) برای انجام اعمال مختلف بر روی رشته ها مورد استفاده قرار می گیرد . همچنین در بعضی از زبانهای برنامه نویسی نیز از موتور Regular Expressions استفاده می شود (نظیر Perl,Ruby,TCL)


اصل Regular Expressions بر روی نظریه ماشینها و نظریه زبانهای صوری تکیه دارد .


جدول زیر نمونه ای از سینتکس های Regular Expressoins می باشد .





[]

range specificication (e.g., [a-z] means a letter in the range a to z)

\w

word character; same as [0-9A-Za-z_]

\W

non-word character

\s

space character; same as [ \t\n\r\f]

\S

non-space character

\d

digit character; same as [0-9]

\D

non-digit character

\b

backspace (0x08) (only if in a range specification)

\b

word boundary (if not in a range specification)

\B

non-word boundary

*

zero or more repetitions of the preceding

+

one or more repetitions of the preceding

{m,n}

at least m and at most n repetitions of the preceding

?

at most one repetition of the preceding; same as {0,1}

|

either preceding or next expression may match

()

grouping




منابع

http://en.wikipedia.org/wiki/Regular_expression

یک سری اطلاعات هم اینجاست:

http://www.grymoire.com/Unix/Regular.html
http://msdn.microsoft.com/en-us/library/az24scfc.aspx

رضا قربانی
یک شنبه 05 شهریور 1391, 20:08 عصر
اولین رو خودم استارت میزنم تا شروعی باشه برای دیگر کاربران :


=============================================
برای درستی آدرس ایمیل :


$Email =$_POST['Email'] ;
if(!preg_match('/^[a-z0-9_\-+\.]+@([a-z0-9\-+]+\.)+[a-z]{2,5}$/i', $Email))
{
die('erorr');
}


==================

درستی آدرس آی پی :
Standard IP-Address(IPv4) RegEX



$ip='192.168.1.2';

if(preg_match('((?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9]))', $ip))

{ echo'okey'; }else { echo'erorr'; }


بالایی برای ورژن 4 بود:
اینم برای درستی آی پیه:
(([2]([0-4][0-9]|[5][0-5])|[0-1]?[0-9]?[0-9])[.]){3}(([2]([0-4][0-9]|[5][0-5])|[0-1]?[0-9]?[0-9]))

رضا قربانی
یک شنبه 05 شهریور 1391, 21:34 عصر
می دونید که یک رمز خوب باید شامل حروف و عدد و ... باشه

من در اینجا اومدم گفتم رمز : شامل هم عدد باشه و هم حروف که حتما باید 6 الی 15 کاراکتر باشه



$pass='ali!@12';

if(preg_match('/(?!^[0-9]*$)(?!^[a-zA-Z!@#$%^&*()_+=<;>;?]*$)^([a-zA-Z!@#$%^&*()_+=<;>;?0-9]{6,15})$/',$pass))

{ echo'okey'; }else { echo'error'; }


===============

در اینجا می گم پسورد ما بین 8 الی 20 کاراکتر از عدد و حروف باشه که در این پسورد نباید بیش از 3 کارکتر تکراری داشته باشیم


$password='Reza 12344 RRR';


if(preg_match('/^(?!.*(.)\1{3})((?=.*[^\w\d\s])(?=.*\w)|(?=.*[\d])(?=.*\w)).{8,20}$/', $password))

{ echo'okey'; }else { echo'error'; }

رضا قربانی
یک شنبه 05 شهریور 1391, 22:22 عصر
شماره تلفن (بیشتر از 10 عدد) :


$tel='0911-111-2345';
if(preg_match('/(\()*((\d){3})(\)*)[ -.]*((\d){3})[ -.]*((\d){4})[ a-zA-Z0-9,-.]{0,10}/', $tel))

{ echo'okey'; }else { echo'error'; }

===============================

پسورد باید بیش از 6 کاراکتر و حداقل یک حروف کوچک و یک حروف بزرگ و یک عدد باشد


$pw='AAaa99';
if(preg_match('/\A(?=[\x20-\x7E]*?[A-Z])(?=[\x20-\x7E]*?[a-z])(?=[\x20-\x7E]*?[0-9])[\x20-\x7E]{6,}\z/', $pw))

{ echo'okey'; }else { echo'error'; }




==============================
پسورد ما باید شامل حروف بزرگ و کوچک - اعداد - کاراکترها دستوری و بیش از 8 و کمتر از 20 کاراکتر باشد


$acc='AAaa987*.&^%$';
if(preg_match('/^(?!.*(.)\1{3})((?=.*[\d])(?=.*[A-Z])(?=.*[a-z])(?=.*[^\w\d\s])).{8,20}$/', $acc))

{ echo'okey'; }else { echo'error'; }


بچه ها بسم الله

desatir7316
دوشنبه 06 شهریور 1391, 09:26 صبح
سلام
دوست عزیز به خاطر تاپیک خوبت ممنون
شاید این به درد بخوره : http://regexlib.com

رضا قربانی
سه شنبه 07 شهریور 1391, 09:22 صبح
سلام
دوست عزیز به خاطر تاپیک خوبت ممنون
شاید این به درد بخوره : http://regexlib.com
در این مبحث که سایت زیاد وجود داره و منم چندتاش رو عرض کردم . حتی سایت های آنلاین... اما اینجا فقط یک کمک و مرجع برای دوستان هست . اگر کسی می تونه توی این تاپیک کمکمون کنه خوشحال میشیم.
با تشکر

رضا قربانی
یک شنبه 12 شهریور 1391, 13:58 عصر
سلام
من می خواهم برای جلوگیری از استفاده از تگ HTML در فرم ها از دستورات زیر استفاده کنم
پاکسازی تگ ها :



$value=' <script> reza </script> <a href="http"//abc.com">test</a>';

echo preg_replace("/<.*?>/", "", $value);

رضا قربانی
شنبه 08 مهر 1391, 12:24 عصر
خلاصه آدرس :
در اینجا یک آدرسی رو وارد می کنیم و میگیم مثلا 22 کارکتر اول رو بگیر و بقیه و نقطه چین ... بذار و در آخر آدرس اصلی رو لینکش میکنم



$text = 'http://mehr-design.ir/test/mr.ghorbani/f/How-Do-I-Make-Short-Urls-On.html';

echo preg_replace("/^(.{1,22})(.*|$)/s", "<a href=".$text.">$1</a>...", $text);



------------------------------------------------------

ورودی فقط عددی بیشتر از 6 رقم :


$Number='123456';
if(preg_match('/^[0-9]{6}/',$Number))
{ echo'okey'; }else { echo'erorr'; }

رضا قربانی
دوشنبه 11 دی 1391, 20:37 عصر
چک کردن درستی آدرس دامنه سایت :
اگر آدرس سایت به درستی وارد شده باشه خروجی ما میشه : 1 ، در غیر این صورت خروجی 0


$A='http://www.mehr-design.ir'; // درستی آدرس سایت رو چک می کنه | http://www.
echo preg_match("/(data|http|https|ftp):\/\/([a-zA-Z0-9_]+)\.([a-zA-Z0-9-_]+)/i",$A); /// output 1

morudi
شنبه 17 فروردین 1392, 21:02 عصر
من یدونه کاربردی شو توی تابع گذاشتم این تابع جمله های اول رو استخراج می کنه

function getFirst($text, $number=2) {
// use regex to split into sentences
$sentences = preg_split('/([.?!]["\']?\s)/', $text, $number+1, PREG_SPLIT_DELIM_CAPTURE);
if (count($sentences) > $number * 2) {
$remainder = array_pop($sentences);
} else {
$remainder = '';
}
$result = array();
$result[0] = implode('', $sentences);
$result[1] = $remainder;
return $result;
}

morudi
شنبه 24 فروردین 1392, 20:04 عصر
<?php
$chars = preg_split('/(<[^>]*[^\/]>)/i', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($chars); //parentheses added
?>
Produces:
Array
(
[0] => <strong>
[1] => Lorem ipsum dolor
[2] => </strong>
[3] => sit <img src="test.png" />amet
[4] => <span class="test" style="color:red">
[5] => consec
[6] => <i>
[7] => tet
[8] => </i>
[9] => uer
[10] => </span>
[11] => .
)

siamakb
چهارشنبه 22 خرداد 1392, 11:19 صبح
واقعا تاپیک خوبیه .
فقط اگه وقت کنید نحوه نوشتن پترن هایی که قرار دادین رو توضیح بدید ممنون میشم.

phpmob
یک شنبه 14 مهر 1392, 22:51 عصر
سلام بنده میخواستم بدونم چه طوری میتونم پاراگراف های یک پست را که کمتر از 100 کاراکتر هست را رنگشون را تغییر بدهم

یه جوری که پاراگراف اول کمتر از 100 بلد
بقیش معمولی

saeed-71
شنبه 20 مهر 1392, 18:46 عصر
چرا ادامه نمیدید؟؟؟؟؟؟؟؟

SilverLearn
شنبه 20 مهر 1392, 18:54 عصر
سلام بنده میخواستم بدونم چه طوری میتونم پاراگراف های یک پست را که کمتر از 100 کاراکتر هست را رنگشون را تغییر بدهم

یه جوری که پاراگراف اول کمتر از 100 بلد
بقیش معمولی

با اجازه آقا رضا :

می تونی به صورت زیر استفاده کنی



/^[\s\S]{100,100}$/

trasilver
یک شنبه 24 آذر 1392, 17:52 عصر
سلام. اگه بخوایم مثلا فقط یک زبان خاص استفاده باشه کدش چی هست؟ مثلا فقط فارسی باشه! یا مثلا چینی باشه + انگلیسی + عدد. یا مثلا انگلیسی + آلمانی باشه.

MostafaEs3
یک شنبه 24 آذر 1392, 20:06 عصر
//////////

trasilver
یک شنبه 24 آذر 1392, 22:43 عصر
با سلام خدمت شما.

روش اول: وارد کردن حروف بصورت تکی


if (!preg_match('/[ابپتثجچحخدذرزژشسصضطظعغفقک گلمنوهیء]+/u', $string)) {
// Persian Chars
}

تذکر: یک فاصله توسط ویرایشگر بین حروف بوجود اومده که نیاز هست حذف کنید.

روش دوم: وارد کردن Range حروف


if (preg_match('/[آ-ی]+/u', $string)) {
// Persian Chars
}


روش سوم: استفاده از Unicode


if (preg_match('/\p{Arabic}/u', $string)) {
// Arabic Chars
}


لینک 1 :: http://stackoverflow.com/questions/4553205/php-regex-and-chinese-characters
لینک 2 :: http://stackoverflow.com/questions/17739665/php-regex-for-german-full-name-with-umlauts-and-some-internationalisation
لینک 3 :: http://php.net/manual/en/regexp.reference.unicode.php
---------------------------
و من الله توفیق

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

رضا قربانی
پنج شنبه 03 بهمن 1392, 01:06 صبح
چک کردن زبان فارسی :


preg_match("/[\x{0600}-\x{06FF}\x]{1,32}/u", 'محمد');

رضا قربانی
پنج شنبه 03 بهمن 1392, 02:10 صبح
خروجی گرفتن فقط عدد در بین جمله :


$Search="این کالا به قیمت 20000 هزار است ";
$Is_Number= preg_replace('/[\x{0600}-\x{06FF}\x]{1,32}/u',"", $Search);//حذف حروف فارسی
$Is_Number=trim(preg_replace('/[a-zA-Z!@#$%^&*()_+=<;>;?]/',"", $Is_Number));// حذف گروه انگلیسی و کاراکترها
echo $Is_Number;
//out : 20000

رضا قربانی
پنج شنبه 03 بهمن 1392, 02:15 صبح
خروجی گرفتن فقط عدد در بین جمله :


$Search="این کالا به قیمت 20000 هزار است ";
$Is_Number= preg_replace('/[\x{0600}-\x{06FF}\x]{1,32}/u',"", $Search);//حذف حروف فارسی
$Is_Number=trim(preg_replace('/[a-zA-Z!@#$%^&*()_+=<;>;?]/',"", $Is_Number));// حذف گروه انگلیسی و کاراکترها
echo $Is_Number;
//out : 20000

tazeha
دوشنبه 21 بهمن 1392, 23:30 عصر
این سایت هم مقاله ی خوبی داره

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

milad465
یک شنبه 29 تیر 1393, 09:55 صبح
ساخت اتوماتیک رگولار اکسپرشن بدون یادگیری قواعد رگولار اکسپرشن. کافیه متن مورد نظر را وارد کنید و بگید کدام قسمتش مدنظرتونه. سپس زبان برنامه نویسی مدنظر خودتونو انتخاب می کنید کد براتون ساخته میشه
txt2re.com (http://txt2re.com/)

myhoo2005
چهارشنبه 07 مرداد 1394, 07:28 صبح
سلام . سایت خوبی یه فقط من متوجه نشدم..!!
من اگز بخوام فرمت واعتبار سنجی ورود اطلاعاتم به صورت مثلا 48/30003/545445 و یا مثلا شماره شبای بانکی به صورت
IR55 4545 5645 6566 8887 2121 65 باشه و فرمت اون رو مثل کنترل وارد کردن یک ایمیل بهم بده چطوری باید عمل کنم ...؟
ممنون

رضا قربانی
یک شنبه 03 آبان 1394, 19:27 عصر
سلام . سایت خوبی یه فقط من متوجه نشدم..!!
من اگز بخوام فرمت واعتبار سنجی ورود اطلاعاتم به صورت مثلا 48/30003/545445 و یا مثلا شماره شبای بانکی به صورت
IR55 4545 5645 6566 8887 2121 65 باشه و فرمت اون رو مثل کنترل وارد کردن یک ایمیل بهم بده چطوری باید عمل کنم ...؟
ممنون
اصلا این حرکت ربطی به -Regular-expression نداره .
با کدهای php یا JS یا JQuery می تونی این عمل رو انجام بدید