php : التعابير العادية

التأكد من صحة البريد الإلكتروني

آخر تحيين: 11-11-2014

preg_replace : البحث و الإستبدال regex : استعمال الرّموز في الأنماط


طريقة إنشاء البريد الإلكتروني

أولا يجب أن نتفق على شيء ، و هو الطرق الصحيحة لإنشاء البريد الإلكتروني . أعرف أن معضمكم قد سبق له إنشاء العديد منها . لكن في هذه المرحلة ، المسألة ليس أنتم . بل زوار موقعكم . فأغلبهم لن يتبعوا طريقتكم بل طريقتهم . أحدهم لديه بريد على هذا الشكل مثلا "me@domaine.com" و آخر : "me_my.self@domaine.com" و ثالث كالتالي : "me_my.self@domaine.sub.com" ... إلخ .
ما لا يعرفه البعض ، هو أنه مسموح لنا استعمال مجموعة من الرّموز في الإسم ، أي قبل علامة "@" و الرّموز المتاحة هي :
! # $ % & ' * + - / = ? ^ _ ` { | } ~
إذاً ، فبريد إلكتروني على هذا الشكل "m#e%m^ys~elf@domaine.info" ، يعتبر صحيحا أيضاً .
لهذا عندما نريد التحقق من صحة البريد الإلكتروني باستعمال التعابير العادية ، يجب أخذ بعين الإعتبار بعض هذه الطّرق حسب حاجتكم . حتّى لا يتفاجأ زائركم بأن بريده خاطيء . و هو على أتم اليقين ، و يقسم يمينا و شمالا أنه استعمل نفس البريد في الكثير من المواقع و تم قبوله ، إلا موقعكم .
الصيغة العامة لإنشاء البريد الإلكتروني هي كالتالي : local@domaine.tld

  1. local : اسم المستخدم .
  2. @ : تعني بالإنجليزية "at" أي "عند"
  3. domaine : إسم المستضيف ، مثلا : "aol", "gmail", "hotmail", "yahoo", "voila" ... إلخ .
  4. tld : إسم النطاق ، مثل : "fr", ".com", ".ma", ".gov", ".info" ...إلخ

التحقق من صحة البريد الإلكتروني

1 ـ إسم المستخدم :
سنبدأ بالتحقق من إسم المستخدم أوّلا ، أي ما يوجد قبل علامة "@" .
حسب معايير RFC3696 . الصحيحة لإنشاء البريد الإلكتروني ، يُسمح لنا باستخدام الحروف اللاتينية و الأرقام و مجموعة من الرّموز :
! # $ % & ' * + - / = ? ^ _ ` { | } ~
لنترجم هذا إلى مصفوفة .
#^[-a-zA-Z0-9!\# \$%&'*+/=?^_`{|}~]+
توجد رموز أخرى . قليلة الإستعمال ، لإتاحتها . يجب مراعاة بعض الشروط :
ـ النقطة "." : يمكن استعمالها شرط أن لا تكون لا في بداية الإسم و لا نهايته . كما لا يُسمح باستعمال نقطتين متتاليتين أو أكثر ، مثال :
zayd...3amr@domaine.com # خطأ
.zayd@domaine.com # خطأ
zayd.@domaine.com # خطأ
zayd.3amr@domaine.com # صحيح


ـ علامة "@" و الفراغ : يمكننا استعمالهما شرط أن نضعهما بين مزدوجتين أو سبقهما برمز backslash "@\" . مثال :
Abc@def@example.com # خطأ
Abc\@def@example.com # صحيح
Zayd\ Bloggs@example.com # صحيح
Amr.\\Zayd@example.com # صحيح
"Abc@def"@example.com # صحيح
"Zayd Bloggs"@example.com # صحيح
!def!xyz%abc@example.com # صحيح

كما لاحظتم في المثال الرابع ، حتى علامة "\" يمكننا استعمالها بإضافة رمز backslash قبلها : "\\" .

بما أن أغلب تطبيقات الويب لا تقبل بهذه الرّموز . مثلا gmail يتيح الحروف و الأرقام و النقطة فقط : [a-zA-Z0-9.] ، أمّا بالنسبة للمستضيف hotmail يقبل بالإضافة رمزي "_" و "-" : [a-zA-Z0-9._-] لهذا سأختزل الشيفرة ، و سأقتصر على إتاحة النقطة و رمزي "_-" .
إذاً ، جزءنا الأول الذي يتعلق باسم المستخدم سيكون كالتالي :

#^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*

حتى لا يبدأ الإسم بالنقطة ، لم أضعها في المصفوفة الأولى .
حتّى لا تظهر النقطة في آخر الإسم أو بصفة متتالية . وضعت هذا الجزء (\.[_a-zA-Z0-9-]+)* داخل قوسين ثم أضفت نجمة . أي أنه يمكن أن يتكرر صفر مرّة أو مرة واحدة أو أكثر . و وضعت النقطة خارج المصفوفة حتى يتأكد الشرط : إذا ظهرت النقطة في إسم المستخدم فمن الضروري أن تكون متبوعة على الأقل بمُكوّن واحد من مكونات المصفوفة ، و هذا الشرط أدّته علامة زائد [_a-zA-Z0-9-]+
بهذا إذا قام الزائر بإدخال بريد إلكتروني حيث الجزء المتعلق بالإسم ، يبدأ أو ينتهي بنقطة أو يضم نقطاً متتالية ، سيتم رفضه ، لأنه بريد غير صحيح و غير موجود .

3 ـ إسم المستضيف
الجزء الذي يلي مباشرة علامة "@" يجب أن يتكون من الحروف و الأرقام و علامة "-" لا غير : [a-zA-Z0-9-]
سيصبح نمطنا كالتالي :
#^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+
بما أننا سنتيح أيضا اسم المستضيف الذي يمكن أن يكون على الشكل "user@domaine.other.tld" أو على هذا الشكل "user@domaine.other1.other2.tld" . سنضيف النقطة و المصفوفة كما فعلنا سابقا و نجعل الكل خياريا :
@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*
سيصبح النمط كالتالي :
#^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*

4 ـ أخيرا يأتي إسم النطاق . يجب أن يبدأ بنقطة "." و يتكون من الحروف فقط ، و ألاّ يقل عددها عن حرفين :
(\.[a-zA-Z]{2,})

نمط البريد الإلكتروني كاملا :
#^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,})$#
لتنظيف الشيفرة قليلا ، سنستعمل المُحوّل "i" . لغض النظر عن حجم الحروف

#^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$#i

هذا النمط سيوافق أغلب مستضيفي العناوين الإلكترونية . مثال الإستعمال :

<?php 
$_POST['email'] = 'my-first.name@domaine.example.com';

if(!empty ($_POST['email']))
{
  if(preg_match("#^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$#i", $_POST['email'])) 
  {
     echo 'البريد الإلكتروني صحيح';
  }else{
     echo '! عذرا ، بريدك غير صحيح';
  }
}
?>

FILTER VALIDATE EMAIL

بما أنكم تعرفتم على طرق استعمال التعابير العادية للتحقق من مطابقة البريد الإلكتروني لمعايير RFC . إعلموا أن لغة PHP لم تهمل شيئا . و وفرت لنا دالة جاهزة تغنيكم عن إرهاق أدمغتكم للبحث عن النمط المثالي ، هذه الدالة هي filter_var(). دالة سهلة الإستعمال ، تعتمد على التعابير العادية و مطابقة لجل مستضيفي العناوين الإلكترونية على الويب . أنصحكم كثيرا باستعمالها بدل برمجة أنماطكم الخاصة .

<?php
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
  echo "! عذرا ، البريد الإلكتروني غير صحيح";
} else {
  echo 'البريد الإلكتروني صحيح';
}
?>

هذه الطريقة تمكنكم من التحقق من صحة البريد الإلكتروني بأقل جهد.

استعملنا التعابير العادية للتحقق من صحة البريد الإلكتروني . هذا جيد ، لكن هذا لا يعني أننا بهذا سنتمكن من إيقاف بعض الزّوار ذوو النوايا السيئة .
مثلا ، يمكن لزائر تسجيل عضويته على موقعكم ببريد صحيح ، لكن هذا البريد ليس بريده ، بل لشخص آخر .

لهذا تبقى الطّريقة المثلى (بالإضافة إلى استعمال التعابير العادية )، هي إرسال رسالة إلى العضو عبر البريد الإلكتروني الذي أدخله . و هذه الرّسالة تتضمن رابطا يجب اتباعه، حتّى يؤكد تسجيله . إن كان هو صاحب البريد ، سيتمكن من تفعيل عضويته . و إن كان غير ذلك . فلن يتمكن نهائيا من التسجيل على موقعكم بهذا البريد المسروق