عبارات با قاعده در PHP - اعتبارسنجی آدرس و شماره تلفن

آموزش عبارات با قاعده در PHP - اعتبارسنجی شماره موبایل

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

اعتبارسنجی آدرس در PHP

برای اعتبار سنجی در مورد آدرس کار بخصوصی لازم نیست انجام دهیم. کافی است؛ به آدرس C:\wamp\www\ecommerce\includes بروید و فایل server.php را با استفاده از Notepad++ باز و کدهای زیر را در آن پیدا کنید.

		// receive city value from the form
		$c_city = $_POST['city'];
		if (empty($c_city)) { array_push($errors, "شهر خود را وارد نکردید!"); }

آنها را پاک کنید و به جای آنها کدهای زیر را قرار دهید.

		// receive city value from the form
		$c_city = $_POST['city'];
		if (empty($c_city)) { array_push($errors, "شهر خود را وارد نکردید!"); }		
		
		// receive address value from the form
		$c_address = mysqli_real_escape_string($con ,$_POST['c_address']);
		if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }

حالا wamp را روشن کنید و آدرس http://localhost/ecommerce/customer_register.php را در مروگر خود باز کنید.

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

وقتی که آدرس وارد نشده باشد

حالا اگر بر روی دکمه "ایجاد نام کاربری " فشار دهید، تصویر زیر را خواهید دید.

پیام خطایی که وقتی آدرس وارد نشده باشد

اگر در مورد آدرس و توابع استفاده شده در آن مشکل دارید می توانید به این قسمت مراجعه نمایید.

حال می خواهیم به این موضوع بپردازیم که اگر کاربر شماره تلفن را به درستی وارد نکرد چه اتفاقی می افتد؟

در این اعتبارسنجی باید برای شماره موبایل یک قالب (pattern) یا الگو به وسیله ی عبارات با قاعده (Regular expressions) بنویسیم. مثلا همه ما می دانیم که شماره موبایل با 09 شروع می شود و تعداد ارقام به کار رفته در شماره موبایل 11 رقم می باشد.

در ادامه شما را با عبارات با قاعده (Regular expressions) و همچنین تابع preg_match()  آشنا می کنم و با استفاده از آنها هر نوع اعتبار سنجی را با همدیگر انجام می دهیم.

عبارات با قاعده در PHP یا Regular expressions

دو نکته حائز اهمیت در مورد عبارات با قاعده وجود دارد:

  1. نکته اول این است که عبارات با قاعده در برنامه نویسی پیشرفته بسیار پرکاربرد می باشند
  2. نکته دوم این است که فهم آنها آسان است ولی نوشتن آنها مشکل

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

عبارات با قاعده در PHP را می توان به صورت یک سیستم برای اعمال یک طرح یا قالب (pattern)، در نظر گرفت.

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

الفاظ (Literals)

اولین دسته از کاراکترها، برای استفاده در طرحها، الفاظ (literals) می باشند. الفاط در حقیقت کاراکترهایی هستند که به همان صورت که نوشته می شوند، تفسیر می شوند. برای مثال، "a" تنها به حرف a متناظر می شود، و یا "ab" تنها به ab و به همین ترتیب.

فوق کاراکترها

فوق کاراکترها، در حقیقت سمبل های ویژه ای هستند، که دارای یک مفهوم و معنای خاص می باشند.

برای مثال اولین فوق کاراکتر، نقطه(.) می باشد که با هر کاراکتری متناظر می شود. بنابراین بر خلاف "a" که تنها به حرف a متناظر می شود. "." به هر یک از حروف مانند a، b، c  و غیره متناظر می شود.

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

از جمله فوق کاراکترهای دیگر ، سه فوق کاراکتر می باشند که با حالتهای مختلفی، متناظر می شوند. برای مثال، "*a" با هر تعداد (صفر و یا بیشتر) کاراکتر a  متناظر می شود (a, aa , aaa , ...)  و یا "+a" با تعداد یک یا بیشتر از یک کاراکتر a متناظر می شود (a,a... ولی حداقل یک a وجود داشته باشد)؛ "?a" با حداکثر یک a متناظر می شود (a و یا بدون a) در این مثالها می توانید کاراکتر a را با هر کاراکتر دیگری جایگزین کنید.

لیست زیر تقریبا تمام کاراکترهای ویژه که در عبارات با قاعده در PHP به کار می روند را نشان می دهد.

کاراکترهای ویژه برای عبارات با قاعده
کاراکتر متناظر می شود با:
. هر کاراکتری
a^ رشته ای که با a شروع می شود. 
$a رشته ای که به a ختم می شود.
+a حداقل یک a
?a صفر و یا یک a
n\ خط جدید
t\ tab
\ (برای escape)
(ab) گروه ab
a/b a و یا b
{2}a aa
{1,3}a a, aa , aaa
[a-z] حروف کوچک
[A-Z] حروف بزرگ
[0-9] ارقام

حالا بعد از شناختی که از عبارات با قاعده در PHP پیدا کردیم به تعریف تابع preg_match می پردازیم.

تابع preg_match برای عبارات با قاعده در PHP چه کاری انجام می دهد

این تابع دو پارامتر ورودی دارد، پارامتر اول همان عبارت منظمی است که ما آن را به عنوان یک الگو یا طرح می سازیم و دومین پارامتر هم رشته ای است که قصد داریم ببینیم که آیا با عبارت با قاعده، متناظر (match) می شود یا نه. به طور خلاصه به کمک این تابع میتوانیم یک رشته را بر اساس الگویی که نوشتیم بررسی کنیم که رشته مورد نظر ما هست یا خیر.

نحوی استفاده از این تابع به صورت زیر است

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

همانطور که مشاهده می کنید، این تابع ۵ پارامتر می گیرد. دقت کنید که ۲ تا از پارامترها باید هنگام تعریف تابع حتما وجود داشته باشند (اجباری هستند) و ۳ تای دیگر از این پارامترها حالت اختیاری دارند.

پارامترهای ورودی توضیح
string $pattern  این پارامتر همان الگوی ما است که با عبارات با قاعده ساخته می شود. این پارامتر اجباری است.
string $subject [  این پارامتر همان عبارتی است که باید در آن به جست و جو الگو پرداخت. این پارامتر اجباری است.
array &$matches [  این پارامتر، جست و جوی های پیدا شده را درون خودش نگهداری می کند.این پارامتر اختیاری است.
int $flags = 0 [ این پارامتر اختیاری است. این پارامتر اگر مقدار دهی شود، برای هر جست و جوی یافت شده، عبارت آفست رو بر میگرداند. این پارامتر دو مقدار زیر را می تواند انتخاب کند.PREG_OFFSET_CAPTURE و PREG_UNMATCHED_AS_NULL 
int $offset = 0 با استفاده از این پارامتر می توانید بگویید که جست و جو را از کجای رشته شروع کند (پیش فرض از اول رشته شروع می کنه). این پارامتر اختیاری است.

دقت کنید که خروجی این تابع یا  0 می شود و یا 1 و یا FALSE.

  1. زمانی 1 می شود که الگوی داده شده به آن، در رشته مورد جستجو یافت شو
  2. زمانی 0 می شود که الگوی داده شده در رشته ورودی، پیدا نشود
  3. FALSE هم زمانی رخ می دهد که یک errore در حین کار بوجود بیاید

یک نکته بسیار مهم این است که همواره از عملگر === برای تست مقدار بازگشتی این تابع استفاده کنید.

اجرای عبارات با قاعده در PHP برای یافتن شماره موبایل دلخواه

حالا که با دو مفهوم عبارات با قاعده در PHP و تابع preg_match آشنا شدیم، اجازه بدهید در یک مثال عملی نحوی به دست آوردن شماره موبایل دلخواه را با همدیگر مشاهده نماییم.

به آدرس C:\wamp\www\ecommerce\includes بروید و فایل server.php را با استفاده از Notepad++ باز کرده و کدهای زیر را در آن پیدا کنید.

		// receive address value from the form
		$c_address = mysqli_real_escape_string($con ,$_POST['c_address']);
		if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }

آنها را پاک کنید و کدهای زیر را به جای آنها قرار دهید.

		// receive address value from the form
		$c_address = mysqli_real_escape_string($con ,$_POST['c_address']);
		if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }
		
		// receive phone value from the form and validation phone value
		$c_phone_validate=mysqli_real_escape_string($con ,$_POST['c_phone']);
		if (empty($c_phone_validate)) 
		{
			array_push($errors, "تلفن خود را وارد نکردید!"); 
			}else{
			if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate))
			{
				// phone is valid
				$c_phone=$c_phone_validate;
				}else{
				array_push($errors, "تلفنی که وارد کردید صحیح نمی باشد!!!");
			} 
		}

همانطور که در کدهای بالا مشاهده می کنید، در قسمتی که شرط را آورده ایم (به کدهای زیر دقت کنید):

if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate))

از تابع preg_match استفاده شده است که دو پارامتر را به آن پاس داده ایم یکی عبارت با قاعده /^[0]{1}[9]{1}\d{9}$/ می باشد و دومین پارامتر تلفن وارد شده توسط کاربر است.

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

  • /^ : رشته از اینجا شروع می شود
  • [0]{1}: به تعداد یک رقم، باید صفر داشته باشد
  • [9]{1}: به تعداد یک رقم، باید نه داشته باشد
  • \d{9}: دقت کنید که \d عبارت میانبری برای [0-9] می باشد. این یعنی اینکه، تعداد 9 رقم داریم که رنج اعداد 0 تا 9 باید داشته باشد
  • $/ : پایان رشته را نشان می دهد

با توجه به توضیحات بالا تابع preg_match بررسی می کند که آیا شماره موبایل وارد شده با الگوی تعریف شده توسط ما(*********09) مطابقت دارد یا خیر؟

حالا با همدیگر به صورت عملی برنامه ای را که نوشته ایم چک می کنیم. به تصاویر زیر نگاه کنید. ابتدا هیچ شماره موبایلی وارد نمی کنیم:

اعتبارسنجی ورودی شماره موبایل در PHP

در تصویر زیر مشاهده می کنید که وب سایت چه واکنشی از خودش نشان می دهد.

اعتبارسنجی شماره موبایل در PHP با عبارات با قاعده

در حالت دوم سعی می کنیم یک شماره تلفن اشتباه را وارد کنیم.

عبارات با قاعده در PHP

در تصویر زیر مشاهده می کنید که نرم افزار ما به راحتی شماره موبایل اشتباه را تشخیص داده و پیام مناسب را به کاربر می دهد.

نمایش پیغام مناسب در اعتبارسنجی شماره موبایل

خب دوستان عزیز در پایان برای شما فایل نهایی server.php را قرار داده ام تا کل کدهای این فایل را تا این لحظه مشاهده نمایید.

<?php
	include('db.php');
	// initializing variables
	$c_name = "";
	$c_lastname    = "";
	$c_email    = "";
	$c_address    = "";
	$c_phone    = "";
	$c_password_1 = "";
	$errors = array(); 
	
	// REGISTER USER
	if(isset($_POST['register'])) {
		// receive all input values from the form
		// form validation: ensure that the form is correctly filled ...
		// by adding (array_push()) corresponding error unto $errors array
		
		// receive name value from the form
		$c_name = mysqli_real_escape_string($con , $_POST['c_name']);
		if (empty($c_name)) { array_push($errors, "نام خود را وارد نکردید!"); }
		
		// receive lastname value from the form
		$c_lastname = mysqli_real_escape_string($con ,$_POST['c_lastname']);
		if (empty($c_lastname)) { array_push($errors, "نام خانوادگی خود را وارد نکردید!"); }
		
		// receive gender value from the form
		$c_gender = $_POST['c_gender'];
		if (empty($c_gender)) { array_push($errors, "جنسیت خود را انتخاب نکردید!"); }
		
		// receive image value from the form and validation image value
		if (empty($_FILES["c_image"]["name"])) 
		{ 
			array_push($errors, "تصویر خود را انتخاب کنید!"); 
			}else{
			$Allowextension = array("jpeg" , "jpg" , "png");
			$FileExtension=explode(".",$_FILES["c_image"]["name"]);
			$extension=end($FileExtension);
			if(in_array($extension,$Allowextension )&&($_FILES["c_image"]["size"]<=20971520))
			{
				if($_FILES["c_image"]["error"]==0)
				{
					$c_image = $_FILES['c_image']['name'];
					$c_image_tmp = $_FILES['c_image']['tmp_name'];
					$new_address_image ="customer/customer_images/".$c_image;
					move_uploaded_file($c_image_tmp,$new_address_image);
					
					}else{
					array_push($errors, "فایل به درستی آپلود نشد!!!");	
				}
				}else{
				array_push($errors, "تصویر مناسب را انتخاب کنید! پسوند مجاز برای تصویر شامل jpeg و jpg و png می باشد و حجم آن نباید بیشتر از 2 مگابایت باشد!!!");
			}
		}
		
		// receive email value from the form and validation email value
		$c_email_no_empty = mysqli_real_escape_string($con ,$_POST['c_email']);
		if (empty($c_email_no_empty)) 
		{
			array_push($errors, "ایمیل خود را وارد کنید!"); 
			}else{
			$c_email_validate=$c_email_no_empty;
			if(filter_var($c_email_validate,FILTER_VALIDATE_EMAIL) == true){
				$c_email=$c_email_validate;
				}else{
				array_push($errors, "ایمیل نادرستی  وارد کرده اید!!! ایمیل درستی وارد کنید.");
			}
		}
		
		// receive state value from the form
		$c_province = $_POST['state'];
		if (empty($c_province)) { array_push($errors, "استان خود را وارد نکردید!"); }  
		
		// receive city value from the form
		$c_city = $_POST['city'];
		if (empty($c_city)) { array_push($errors, "شهر خود را وارد نکردید!"); }		
		
		// receive address value from the form
		$c_address = mysqli_real_escape_string($con ,$_POST['c_address']);
		if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }
		
		// receive phone value from the form and validation phone value
		$c_phone_validate=mysqli_real_escape_string($con ,$_POST['c_phone']);
		if (empty($c_phone_validate)) 
		{
			array_push($errors, "تلفن خود را وارد نکردید!"); 
			}else{
			if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate))
			{
				// phone is valid
				$c_phone=$c_phone_validate;
				}else{
				array_push($errors, "تلفنی که وارد کردید صحیح نمی باشد!!!");
			} 
		}		
		
		
	}
?>

عزیزان خسته نباشید، به پایان این قسمت از سری قسمت های آموزش ساخت فروشگاه اینترنتی با php رسیدیم، انشاالله که لذت کافی رو از کدهای نوشته شده، برده باشید. در قسمت آینده به سراغ ورودی پسورد می رویم. اعتبار سنجی ورودی پسورد هم مانند ورودی شماره تلفن است اما با شرایط ویژه ی خودش (قسمت آینده عبارات با قاعده پیچیده تری را خواهم داشت). موفق باشید

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری فروشگاه اینترنتی با PHP توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (3 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

داود محسنی
04 تیر 1401
سلام وقت بخیر ببخشید برای فرمی که با المنتور طراحی کردم می خواستم یه کد پی اچ چی بزام که شماره موبایل درست رو شناسایی کنه همین میشه کدش رو برام بزارید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

حمیدیه
26 خرداد 1398
با سلام و عرض تشکر وقتی روی دکمه ایجاد نام کاربری زده می شود خطای زیر مشاهده شده و فونتها هم به هم میریزد Notice: Undefined variable: con in C:\xampp\htdocs\ecommerce\includes\server.php on line 19 Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\ecommerce\includes\server.php on line 19 علت چیست؟ ممنون می شوم جواب دهید باتشکرf

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سارا
24 دی 1397
برای error شماره تلفن وقتی اشتباه وارد میکنم فقط مینویسه شماره تلفن را وارد نکردید.نمیگه که شماره تلفن اشتباه است. کدهارو رو هم از همینجا عینا کپی کردم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
25 دی 1397
سلام لطفا به ایمیل خودتون مراجعه کنید. فایل های خودتون رو به ایمیل من بفرستید، تا ببینم ایراد کار شما از کجاست. اگر به آدرس https://www.roxo.ir/home/programming/php-online-shop-script مراجعه بفرمایید من از قالب نهایی، فیلم تهیه کردم. توی فیلم به وضوح قالب به درستی کار میکنه. با تشکر از شما، جهانگیر پچکم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.