String Manipulation and Regular Expressions php





معالجة السلاسل والتعابير المنتظمة

الجزء الأول



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

إنشاء تطبيق بسيط: البريد الذكي

سنستخدم توابع السلاسل والتعابير المنتظمة لإنشاء تطبيق البريد ، ثم سنقوم بإضافة هذا التطبيق إلى موقع بوب لقطع غيار السيارات الذي تم بناؤه  في الدروس السابقة.
سنقوم بإنشاء نموذج بسيط وشائع لإدخال ملاحظات الزبائن وشكاويهم وتعليقاتهم ، كما في الشكل التالي:





ومع ذلك ، يحتوي هذا التطبيق على تحسين واحد مقارنة بالكثير الذي ستجده على الويب.
في هذا النموذج بدلاً من إرسال المعلومات إلى عنوان بريد إلكتروني عام سنحاول وضع بعض الذكاء في معالجة عملية الإرسال وذلك من خلال البحث في المعلومات المدخلة من قبل المستخدم عن مفتاح أو كلمات أو عبارات تشير إلى الموظف المناسب الذي يجب إرسال البريد الإلكتروني إليه.
على سبيل المثال ، إذا كان البريد الإلكتروني يحتوي على كلمة إعلان نقوم بإرسال المعلومات إلى قسم التسويق وإذا كان البريد الإلكتروني من أكبر زبائن شركة بوب ، فيمكننا توجيهه مباشرة إلى بوب.
سنقوم الآن بكتابة البرنامج النصي البسيط  processfeedback.php  لإنشاء نموذج البريد الإلكتروني على الشكل التالي:
<?php
//create short variable names
$name=$_POST['name'];
$email=$_POST['email'];
$feedback=$_POST['feedback'];

//set up some static information
$toaddress =   "feedback@example.com";
$subject =         "Feedback from web site";
$mailcontent = "Customer name: ".$name."\n".
                             "Customer email: ".$email."\n".
                             "Customer comments:\n".$feedback."\n";
$fromaddress = "From: webserver@example.com";
//invoke mail() function to send mail
mail($toaddress, $subject, $mailcontent, $fromaddress);
?>
<html>
<head>
<title>Bob's Auto Parts - Feedback Submitted</title>
</head>
<body>
<h1>Feedback submitted</h1>
<p>Your feedback has been sent.</p>
</body>
</html>

بشكل عام ، يجب علينا التحقق من قيام المستخدمين بملء جميع الحقول المطلوبة في النموذج من خلال التابع
Isset() .
في هذا البرنامج النصي قمنا بربط حقول النموذج معًا و استخدمنا التابع mail()  الموجود مسبقاً في PHP
لإرسال المعلومات الموجودة في هذه الحقول إلى عنوان البريد الالكتروني المحدد.
إن الشكل العام للتابع mail() هو:



 bool mail(string to, string subject, string message, string [additional_headers ],    string [additional_parameters]);



الوسطاء الثلاثة الأولى إجبارية وتمثل عنوان البريد الإلكتروني الذي نريد إرسال الرسالة له ، و موضوع الرسالة ، ومحتويات الرسالة ، على التوالي.
الوسيط الرابع اختياري و يمكن استخدامه لإرسال معلومات إضافية أخرى مثل حقول : From , Reply-To , Cc  وإذا كنا نريد أكثر من حقل إضافي ، فما علينا سوى الفصل بينها باستخدام المحارف  (\n\r)  داخل السلسلة ، كما يلي:
$additional_headers=”From: webserver@example.com\r\n “
                                        .’Reply-To: bob@example.com";
الوسيط الخامس أيضاً اختياري ويستخدم لتمرير بعض المعاملات إلى البرنامج الذي قمنا بإعداده.
لاستخدام التابع ()mail والتحقق من عمله يجب أن نقوم بإعداد عنوان البريد الإلكتروني للإشارة إلى البريد الإلكتروني الخاص بنا.


أولاً : تنسيق السلاسل:

غالباً ما نحتاج إلى تنظيم سلاسل المستخدمين قبل استخدامها لذا سنتناول بعضاً من التوابع التي يمكننا استخدامها لهذا الغرض.

·         تشذيب أو ترتيب السلاسل:  chop() ,  ltrim()  ,  trim()

الخطوة الأولى في ترتيب السلاسل هي حذف أي مسافة زائدة من السلسلة وعلى الرغم من أن هذه الخطوة ليست إجبارية أبدًا إلا أنها قد تكون مفيدة إذا كنا سنقوم بتخزين هذه السلسلة في ملف ما أو في قاعدة بيانات ، أو إذا كنا نريد مقارنتها مع سلاسل أخرى.
$name = trim($_POST['name']);
$email = trim($_POST['email']);
$feedback = trim($_POST['feedback');
حيث يقوم التابع trim()  بشطب أي مسافة بيضاء من بداية ونهاية السلسلة وإرجاع سلسلة جديدة وبشكل افتراضي فإن المحارف التي يقوم هذا التابع  بحذفها هي :
-          محارف التي تدل على الأسطر الجديدة ومحارف الانتقال  (  \n  and  \r  ).
-          المحارف التي تدل على علامات التبويب الأفقية والعمودية (  \t  and  \x0B  ).
-          المحارف التي تدل على نهاية السلسلة ( \0 ).
-          الفراغات.
لكن يمكننا أيضًا أن نحدد المحارف التي نريد حذفها بدلاً من هذه القائمة الافتراضية من خلال تمريرها كوسيط ثاني إلى هذا التابع.
بالنسبة للتوابع  ltrim()  أو   rtrim()  فهما مشابهان للتابع trim()   فكلاهما يأخذان سلسلة ما كوسيط ويعيدانها بشكل منسق ، لكن الفرق بين هذه التوابع الثلاثة هو أن trim()  يزيل المسافات البيضاء من بداية ونهاية السلسلة ، بينما التابع  ltrim()  يزيل المسافات البيضاء من بداية السلسلة (أو اليسار) فقط ، و التابع rtrim()  يزيل المسافات البيضاء من نهاية السلسلة (أو اليمين) فقط.

·         تنسيق السلاسل لتصبح مناسبة لاستخدامها في أماكن مختلفة:

تتضمن لغة PHP مجموعة من التوابع التي يمكننا استخدامها لإعادة تهيئة السلاسل بطرق مختلفة.
-          تنسيق السلاسل من أجل لغة HTML : بواسطة التابع  nl2br()


يأخذ التابع  nl2br()  سلسلة ما كوسيط له ويستبدل جميع المحارف التي تدل على أسطر جديدة فيها بالعلامة <br /> التي تستخدمها لغة HTML  ، وبالتالي يفيدنا هذا التابع في طباعة سلسلة طويلة إلى المتصفح على الشكل التالي:
<p>Your feedback (shown below) has been sent.</p>
<p><?php echo nl2br($mailcontent); ?> </p>
إن لغة  HTML   تتجاهل المساحات البيضاء العادية مثل المحرف  \n    لذلك إذا لم نقم بتصفية السلسلة   $mailcontent  باستخدام التابع  nl2br()  سوف يظهر الإخراج كله على سطر واحد.
سيكون ناتج تنفيذ الكود السابق على الشكل التالي:  





-          تنسيق السلاسل من أجل الطباعة: 
حتى الآن نحن نستخدم التعليمة  echo  من أجل الطباعة ، بينما يوجد في لغة PHP   التابع print() الذي يقوم بالطباعة أيضاً مثل echo لكن الفرق أنه يعيد لنا القيمة المنطقية (true or false)  وذلك حسب نتيجة الطباعة.
يمكننا تطبيق بعض الأمور الأكثر تطوراً باستخدام التابعين printf() ,  sprintf()   فهما يعملان بشكل أساسي بنفس الطريقة ، إلا أن التابع  printf()  يطبع السلسلة المنسقة إلى المتصفح بينما التابع  sprint()  يرجع السلسلة المنسقة.
إن الشكل العام لهذه التوابع هو:
string sprintf (string format , [mixed args...])
void printf (string format , [mixed args...])
حيث الوسيط الأول لكل منهما هو السلسلة التي نريد طباعتها ، بينما الوسطاء الأخرى هي المتغيرات التي سيتم استبدالها في هذه السلسلة.
على سبيل المثال ، باستخدام التعليمة  echo يمكننا استخدام المتغيرات التي نريد طباعتها في السطر على الشكل التالي:
echo “Total amount of order is $total.”;
و للحصول على نفس النتيجة مع التابع  printf()  نكتب:
printf (“Total amount of order is %s.”, $total);
يُسمى  %s  في السلسلة   "مواصفة تحويل "  وهو يعني " الاستبدال كسلسلة " ، وفي هذه الحالة يتم استبدال هذا الرمز بالمتغير $total الذي سيتم تفسيره على أنه سلسلة ، فلو كانت القيمة المخزنة فيه هي 12.4 فسوف تتم طباعته على أنه سلسلة وليس رقم في كلا الأسلوبين السابقين.
لكن يمكننا الاستفادة من ميزات التابع  printf()  وطباعة المتغير $total على أنه رقم حقيقي يحوي على منزلتين بعد الفاصلة العشرية ، وذلك على الشكل التالي: 
printf (“ Total amount of order is %.2f ”, $total );
استخدمنا هنا الرمز %.2f   والذي يعني " الاستبدال كرقم حقيقي مع منزلتين بعد الفاصلة " وبالتالي سيكون ناتج طباعة المتغير $total  هو  12.40 .
يمكننا تمرير العديد من مواصفات التحويل في التابع printf()  ، فإذا كان لديك n مواصفة تحويل ضمن السلسلة سيكون لدينا n  وسيط ، وسيتم استبدال كل مواصفة تحويل بالوسيط المقابل لها على التوالي ، وذلك على الشكل التالي:
printf (“ Total amount of order is %.2f (with shipping %.2f)  “, $total , $total_shipping);

وهنا تستخدم مواصفة التحويل الأولى المتغير $total ، بينما تستخدم الثانية المتغير $total_shipping.
إن الشكل العام لأي مواصفة تحويل هو:
% [‘padding_character] [-] [width] [.precision] type

-          حيث تبدأ جميع مواصفات التحويل بالرمز  %   فإذا كنا نريد بالفعل طباعة الرمز % نحتاج إلى استخدام  رمزين متتاليين على الشكل : %%


-          padding_character : 
وهو اختياري ويتم استخدامه لزيادة العرض الخاص بالمتغير مثل إضافة عدد من الأصفار في بداية رقم ما مثل العداد.
المحرف الافتراضي هنا هو محرف المسافة  (space)  أو العدد صفر وفي حال استخدمنا هذه المحارف الافتراضية لا داعي لوضع علامة الاقتباس الأحادية () ، أما إذا استخدمنا محارف أخرى لا بد من وضع هذه العلامة.
الرمز (-) :
وهو أيضاً اختياري وهو يحدد أن البيانات في الحقل سيتم ضبطها على اليسار بدلاً من اليمين ( وهذا هو الافتراضي ) .

-          width :
وهو يخبر التابع printf()  بالمسافة (بالمحارف) التي يجب تركها للمتغير ليتم استبداله هنا.

-          Precision :
يجب أن يبدأ هذا المحدد بنقطة عشرية ، وهو يخبر التابع printf()  بعدد المنازل التي نريد عرضها بعد الفاصلة العشرية.

-          Type :
هو محدد النوع ، ويوجد هنا جدول يحوي على رموز هذا المحدد وماذا يعني كل رمز.
Type                    Meaning
b           التفسير كعدد صحيح والطباعة كرقم ثنائي.  
c           التفسير كعدد صحيح والطباعة كمحرف.
d           التفسير كعدد صحيح والطباعة كرقم عشري.
f            التفسير كعدد حقيقي والطباعة كرقم حقيقي بالفاصلة العائمة.
                      o          التفسير كعدد صحيح والطباعة كرقم ثماني.
                      s           التفسير كسلسلة والطباعة كسلسلة.
                      u          التفسير كعدد صحيح والطباعة كعدد عشري بدون إشارة.
                      x          التفسير كعدد صحيح والطباعة كعدد ستة عشري بأحرف صغيرة.
                      X          التفسير كعدد صحيح والطباعة كعدد ستة عشري بأحرف كبيرة.

عند استخدام التابع printf()   مع أحد الرموز السابقة التي تحدد الـ type ، يمكننا استخدام وسيط الترقيم الذي يحدد رقم الوسيط الذي نريد تبديل مواصفة التحويل به ، وهذا يعني أن باقي الوسطاء في التابع لا تحتاج أن تكون بنفس ترتيب مواصفات التحويل ، ومثال على ذلك:
printf (“Total amount of order is %2\$.2f (with shipping %1\$.2f) “,
            $total_shipping, $total);
نلاحظ هنا وجود 2\$ بعد الرمز  %  وهذا يعني استبدال هذه المواصفة بالوسيط الثاني من قائمة الوسطاء ، وهذه الطريقة مفيدة في حال أردنا تكرار استبدال الوسيط نفسه بمواصفات تحويل أخرى.
هناك توابع أخرى بديلة للتوابع السابقة هي vprintf() ,  vsprintf()   حيث تأخذ هذه التوابع وسيطين هما : السلسلة و مصفوفة من الوسطاء.

-          تغيير حالة السلسلة: 
يوجد في PHP   العديد من التوابع التي تقوم بتغيير حالة السلسلة وهي على الشكل التالي:
-         strtoupper($subject): يقوم هذا التابع بتغيير السلسلة $subject  إلى أحرف كبيرة.
-         strtolower($subject): يقوم هذا التابع بتغيير السلسلة $subject  إلى أحرف صغيرة.
-         ucfirst($subject):
يقوم بتحويل الحرف الأول من السلسلة إلى حرف كبير في حال كانت السلسلة عبارة عن حروف أبجدية.
-         ucwords($subject):
يقوم بتحويل الحرف الأول من كل كلمة تبدأ بحرف أبجدي في السلسلة إلى حرف كبير.


·         تنسيق السلاسل لاستخدامها في التخزين: addlashes()  ,  stripslashes()


يوجد في PHP   بعض التوابع التي تقوم بإعادة تهيئة السلاسل لتصبح مناسبة للتخزين في قواعد البيانات فبعض المحارف الموجودة في السلاسل يمكن أن تسبب مشاكل عندما نقوم بإدخالها في قاعدة البيانات ، لأن قاعدة البيانات يمكن أن تفسر هذه المحارف على أنها محارف تحكم.
من هذه المحارف علامات الاقتباس (المفردة والمضاعفة) ، الخطوط المائلة العكسية (\) ، والمحرف NULL.
وبالتالي نحن بحاجة إلى العثور على طريقة لتمييز هذه المحارف أو الهروب منها بحيث تستطيع قواعد البيانات فهمها على أنها محرفاً عادياً وليست تحكم ، ولتحقيق ذلك سنقوم بوضع الخط المائل العكسي (\) قبل كل محرف من هذه المحارف ، على سبيل المثال:
-          علامة الاقتباس المزدوجة ستصبح على الشكل  (\”).
-          الخطوط المائلة العكسية ستصبح على الشكل (\\).
ولتطبيق ذلك سنستخدم التابعين addlashes()  ,  stripslashes() ، فقبل كتابة أي سلسلة إلى قاعدة البيانات يجب تطبيق التابع addlashes()  على هذه السلسلة وذلك على الشكل التالي:
$feedback = addslashes(trim($_POST['feedback']));

حيث يأخذ هذا التابع السلسلة المراد إجراء التغييرات عليها كوسيط ويعيد لنا السلسلة بعد إجراء التعديلات عليها.
ولإعادة السلسلة إلى ما كانت عليه نستخدم التابع المعاكس وهو stripslashes().
ويوضح الشكل التالي الآثار الفعلية لاستخدام هذين التابع:





ثانياً : ضم السلاسل وتقسيمها:

في كثير من الأحيان ، قد نحتاج إلى التعامل مع أجزاء من سلسلة ما وليس إلى كامل السلسلة فربما نحتاج مثلاً إلى بعض الكلمات في جملة ، أو قد نحتاج إلى تقسيم اسم المجال أو عنوان البريد الإلكتروني إلى الأجزاء المكونة له ، تتيح لنا لغة PHP العديد من التوابع لتحقيق ذلك.

·         استخدام implode()  ,  join()     explode() , :


الشكل العام للتابع explode()  هو:
array explode (string separator, string input , [ int limit]);
حيث يأخذ هذا التابع السلسلة input  ويقوم بتقسيمها إلى أجزاء عند فاصل محدد هو separator ويعيد لنا الأجزاء المقطعة ضمن مصفوفة ، ويمكننا الحد من عدد الأجزاء باستخدام الوسيط الثالث الاختياري.
فمثلاً للحصول على اسم المجال من عنوان البريد الإلكتروني للزبون في البرنامج النصي ، يمكننا استخدام الكود التالي:
$email_array = explode (‘@’, $email);
يقوم هنا التابع  explode()   بتقسم عنوان البريد الإلكتروني للزبون إلى قسمين: اسم المستخدم الذي سيتم تخزينه في المتغير $email_array[0] ، واسم المجال الذي سيتم تخزينه في المتغير $email_array[1] ، وبالتالي يمكننا الآن اختبار اسم المجال وإرسال ملاحظات الزبون إلى الشخص المناسب على الشكل التالي:
if ($email_array[1] == “bigcustomer.com”)
   {
       $toaddress = “bob@example.com”;
   }
else
  {
       $toaddress = “feedback@example.com”;
  }
لكن إذا كان اسم المجال كبيراً أو مختلطًا ، فلن تنجح هذه الطريقة ، ولتجنب هذه المشكلة يمكن تحويل اسم المجال أولاً إلى أحرف كبيرة أو صغيرة ثم التحقق من وجود تطابق ، كما يلي:
if (strtolower ($email_array[1]) == “bigcustomer.com”)
   {
           $toaddress = “bob@example.com”;
   }
else
  {
         $toaddress = “feedback@example.com”;
  }
التوابع implode()  و join()  هي توابع عكسية للتابع explode()   فمثلاً:
$new_email = implode(‘@’, $email_array);
يقوم هنا التابع   implode()  بأخذ الوسيط الثاني وهو المصفوفة  $email_array  ويضم أجزاءها باستخدام الوسيط الأول وهو هنا @ .

·         استخدام strtok()  :

بخلاف التابع explode() الذي يقوم بتقسم السلسلة إلى مجموعة أجزاء في وقت واحد ، يحصل التابع  strtok()  على جزء واحد من السلسلة في وقت واحد.
الشكل العام للتابع strtok()  هو على الشكل التالي:
string strtok (string input , string separator);
حيث يمكن أن يكون الفاصل separator إما محرف واحد أو سلسلة من المحارف ، ويقوم هذا التابع بتقسيم السلسلة  input  عند كل من المحارف الموجودة في سلسلة الفاصل separator ، ويعيد لنا الجزء الأول فقط الناتج عن التقسيم.
إذاً للحصول على الجزء الأول من السلسلة نستدعي التابع strtok()  مع الوسطين ( السلسلة و الفاصل ) ، بينما للحصول على الجزء الثاني يكفي استدعاء التابع strtok()  مع الوسيط الثاني فقط والذي هو الفاصل ، وذلك لأن استدعاء هذا التابع يحفظ مؤشر إلى الموقع الحالي في السلسلة.
إذا أردنا إعادة تعيين المؤشر يمكننا تمرير السلسلة مرة أخرى إلى التابع strtok() .
وبالتالي سيكون استخدام التابع strtok()  على الشكل التالي:
$token = strtok ($feedback , “ “);
echo $token.”<br />”;
while ($token != “”)
{
    $token = strtok(“ “);
    echo $token.”<br />”;
}
يقوم هذا الكود بطباعة كل جزء من ملاحظات الزبون على سطر جديد ويستمر ضمن حلقة while إلى أن تنتهي كل الأجزاء في الموجودة في $feedback .

·         استخدام substr ()  :


هذا التابع يمكننا من الوصول إلى سلسلة فرعية من السلسلة الأصلية بين بداية ونهاية معينة ، وله الشكل العام التالي:
string substr (string string , int start , [ int length] );
هذا التابع يقوم بإرجاع سلسلة فرعية تم نسخها من داخل السلسلة الأصلية اعتباراً من الموضع start وبمقدار الطول length .
بفرض لدينا السلسلة التالية:
$test = ‘Your customer service is excellent’;
فإذا قمنا باستدعاء التابع substr()  مع الوسيط  start  فقط ، فسنحصل على السلسلة الفرعية من الموضع start وإلى نهاية السلسلة الأصلية ، فمثلاً الاستدعاء التالي:
substr ($test, 1);
سيعطي النتيجة التالية:      our customer service is excellent
أي سيتم حذف المحرف الأول فقط لأن المحرف الأول له الموضع (0).
وإذا قمنا باستدعاء التابع substr()  مع قيمة سالبة للوسيط  start  فقط ، فسيبدأ التابع بالعد من نهاية السلسلة الأصلية بمقدار العدد  start ثم يعطي السلسلة الفرعية ابتداءً من الموضع الذي وصل إليه بالعد وإلى نهاية السلسلة الأصلية ، فمثلاً الاستدعاء التالي:
substr($test, -9);
سيعطي النتيجة التالية:  excellent
وسيط الطول في هذا التابع يستخدم لتحديد الطول الذي نريده من بداية السلسلة الأصلية إذا كان موجباً إما إذا كان سالباً فيستخدم لتحديد الطول الذي نريد حذفه ولكن من نهاية السلسلة الأصلية ، فمثلاً الاستدعاء التالي:
substr ($test, 0, 4);
سيعطي النتيجة التالية:  Your
أما الاستدعاء التالي:
echo substr ($test, 5, -13);

سيعطي النتيجة التالية:  customer service

ثالثاً : مقارنة السلاسل:


·         تنفيذ ترتيب السلسلة مع التوابع strcmp() , strcasecmp() ,  strnatcmp() :


نستخدم التوابع strcmp() , strcasecmp()   , strnatcmp()  لترتيب السلاسل ويفيدنا ذلك عندما نقوم بفرز البيانات.
الشكل العام للتابع strcmp():
int strcmp(string str1, string str2);
حيث يوجد لهذا التابع وسيطين هما السلسلتين اللتين نريد مقارنتهما ويعيد لنا القيمة (0) إذا كانت السلسلتين متساويتين ، أما إذا كانت السلسلة str1 تأتي بعد (أو أكبر من) السلسلة str2 وفق الترتيب الأبجدي فإن التابع يعيد عدد أكبر من الصفر ، بينما إذا كانت السلسلة str1 أقل من السلسلة str2 وفق الترتيب الأبجدي فإن التابع يعيد عدد أصغر من الصفر، ويجب أن نلاحظ أن هذا التابع حساس لحالة الأحرف.
 التابع strcasecmp()  مطابق للتابع  strcmp()   لكن الفرق بينهما أن التابع strcasecmp() غير حساس لحالة الاحرف.
التابع strnatcmp() حساس لحالة الأحرف وله التابع التوأم الغير حساس لحالة الأحرف strnatcasecmp()  يقومان بمقارنة السلاسل وفق الترتيب الطبيعي أي الترتيب الذي يقوم به الشخص العادي ، فمثلاً إذا كان لدينا السلسلة (2) والسلسلة (12) ، التابع strcmp() سيرتب السلسلة 2 على أنها أكبر من السلسلة 12 لأنها بالترتيب الأبجدي أكبر ، أما التابع strnatcmp() سيرتبهم بالعكس.

·         اختبار طول السلسلة مع التابع strlen() :

يقوم هذا التابع بالتحقق من طول السلسلة التي تمرر له كوسيط ويعيد لنا الطول كعدد صحيح.
مثال على ذلك:
echo 'strlen("hello")';
هذا الكود يعطينا النتيجة (5).
يمكننا استخدام هذا التابع للتحقق من صحة بيانات الإدخال ، فمثلاً ليكن لدينا عنوان البريد الإلكتروني
المخزن في المتغير  email$  ونريد التحقق من صحته ، إن إحدى الطرق الأساسية للتحقق من صحة هذا العنوان هو التحقق من طوله لأن الحد الأدنى لطول أي عنوان بريد إلكتروني هو ستة أحرف مثل:  a@a.to  وبالتالي إذا كان طول المتغير email$  أقل من ستة سيكون هذا العنوان خاطئ ، على الشكل التالي:
if (strlen ($email) < 6)
{
echo ‘That email address is not valid’;
exit; // force execution of PHP script
}

رابعاً: مطابقة السلاسل أو استبدالها باستخدام توابع السلاسل:

إن التحقق من وجود سلسلة فرعية معينة في سلسلة أكبر هو عملية شائعة ولها فائدة أكبر من عملية التحقق من المساواة على كامل السلسلة.

·         البحث عن سلسلة ما في سلسلة أخرى: , strchr () ,  strrchr() , stristr()   strstr()

يمكن استخدام أي تابع من التوابع السابقة للعثور على سلسلة ما داخل سلسلة أخرى.
التابع الأكثر شيوعاً هو  strstr()  يستخدم للبحث عن سلسلة أو محرف ضمن سلسلة أطول ، وله الشكل العام التالي:
string strstr (string haystack , string needle);

يأخذ هذا التابع وسيطين : الأول هو السلسلة haystack التي نبحث فيها ، والثاني هو السلسلة needle التي نبحث عنها ، فإذا تم العثور على السلسلة الثانية needle ضمن السلسلة الأولى haystack بشكل دقيق يعيد لنا التابع جزء من السلسلة haystack ، يبدأ هذا الجزء من بداية السلسلة needle   وينتهي بنهاية السلسلة haystack ، و إذا تكرر ظهور السلسلة needle ضمن السلسلة haystack  ستبدأ السلسلة المعادة من هذا التابع من بداية التكرار الأول للسلسلة needle .

مثلاً في التطبيق Smart Form الذي ذكرناه سابقاً والذي نريد فيه تحديد المكان الذي سيتم إرسال البريد الإلكتروني إليه بشكل ذكي يمكننا أن نكتب:
$toaddress = ‘feedback@example.com’;    // the default value

// Change the $toaddress if the criteria are met

if (strstr($feedback, ‘shop’))
           $toaddress = ‘retail@example.com’;
else if (strstr($feedback, ‘delivery’))
          $toaddress = ‘fulfillment@example.com’;
else if (strstr($feedback, ‘bill’))
          $toaddress = ‘accounts@example.com’;
نلاحظ في هذا الكود أننا نبحث عن كلمات مفتاحية ضمن تعليقات الزبون تدلنا على المكان الذي سيتم إرسال البريد إليه ، فمثلاً إذا قرأ الكود في أحد تعليقات الزبائن العبارة التالية:
“I still haven’t received delivery of my last order,”

سيكتشف وجود الكلمة  delivery  وبالتالي سيتم إرسال البريد إلى العنوان fulfillment@example.com
لدينا توابع بديلة للتابع strstr() ، البديل الأول هو التابع  stristr()  وهو تقريبًا مطابق للتابع  strstr() إلا أنه ليس حساس لحالة الأحرف ، وهذا مفيد لهذا التطبيق لأن الزبون قد يكتب "delivery" ,  "Delivery" ,  "DELIVERY" .
البديل الثاني هو التابع  strrchr()  وهو أيضاً تقريباً مطابق للتابع  strstr()  إلا أنه يعيد لنا سلسلة تبدأ من آخر ظهور للسلسلة needle  التي نبحث عنها و إلى نهاية  haystack التي نبحث فيها.


·         البحث عن موضع سلسلة ما في سلسلة أخرى: strrpos()  ,  strpos()   


تعمل التوابع  strops() , strrpos()  بطريقة مشابهة لـ strstr() لكن الفرق أنه بدلاً من إرجاع سلسلة فرعية يتم إرجاع الموضع العددي لبداية السلسلة التي نبحث عنها.
يوصي دليل PHP باستخدام التابع strops()  بدلاً من strstr()  لأنه يعمل بشكل أسرع.
الشكل العام للتابع strops()  هو على النحو التالي:
int strops (string haystack, string needle, int [offset] );
حيث يمثل العدد الصحيح الذي تم إرجاعه من التابع موضع التواجد الأول للسلسلة needle ضمن السلسلة haystack  ، وكالعادة المحرف الأول من أي سلسلة يكون له الموضع (0).
مثال على ذلك :
$test = "Hello world";
echo strops ($test, "o");
يعيد لنا هذا الكود الرقم (4) وهو الموضع الأول لظهور الحرف  o  ضمن السلسلة test .
بالنسبة للوسيط الثالث  offset للتابع  strops()  فهو اختياري وهو يحدد الموضع الذي نريد أن نبدأ بالبحث منه في السلسلة haystack .
مثال على ذلك:
echo strpos($test, ‘o’, 5);

يعيد لنا هذا الكود الرقم (7) لأن التابع strops() سيبدأ البحث عن الحرف  o  ضمن السلسلة  test من الموضع (5) وبالتالي فإنه لن يرى هذا الحرف في الموضع (4) .
بالنسبة للتابع  strrpos()  فهو مطابق تقريبًا للتابع strops()  إلا أنه يعيد موضع التواجد الأخير للسلسلة  needle  ضمن السلسلة haystack .
في أي من هذه الحالات ، إذا لم تكن السلسلة  needle  موجودة ضمن السلسلة haystack فإن التوابع  strops() , strrpos()  سوف تعيد لنا النتيجة  false  التي تساوي القيمة (0) ، وهذا قد يسبب مشكلة لأن القيمة (0) تدل أيضاً على الموضع الأول في السلسلة haystack ، وبالتالي لتجنب هذه المشكلة نستطيع استخدام العملية (===) لاختبار القيم المرجعة على الشكل التالي:
$result = strops ($test, “H”);

if ($result === false)
 {
      echo “Not found”;
  }
else
  {
    echo “Found at position ".$result;
  }

·         البحث عن سلسلة ما في سلسلة أخرى واستبدالها: str_replace() , substr_replace()  


يمكن أن يكون البحث عن سلاسل فرعية واستبدالها بأخرى مفيد جداً ، حيث يمكننا استخدامه إذا أردنا استبدال الملفات التي تم إنشاؤها بواسطة PHP وجعلها قابلة للقراءة من خلال استبدال <name> مع اسم شخص ما و < address> مع عنوان ما ، كما يمكننا أيضاً استخدام البحث والاستبدال من أجل
التركيزعلى مصطلحات معينة ، كما هو الحال في تطبيق منتدى المناقشة ، أو حتى في تطبيق النموذج الذكي للبريد الإلكتروني الذي ذكرناه سابقاً.
التابع الأكثر استخداماً هو str_replace()  الذي له الشكل العام التالي:
mixed str_replace(mixed needle, mixed new_needle, mixed haystack,[ int &count]));
يقوم هذا التابع باستبدال السلسلة  needle  بالسلسلة الجديدة  new_needle  وإرجاع الإصدار الجديد من haystack ، حتى ولو ظهرت السلسلة needle أكثر من مرة ضمن السلسلة haystack.
بالنسبة للوسيط الرابع count فهو اختياري وهو يدل على عدد مرات الاستبدال المطلوبة.
ملاحظة:
يمكننا تمرير جميع الوسطاء كمصفوفات ، أي يمكننا تمرير مصفوفة من الكلمات التي نريد استبدالها ومصفوفة من الكلمات لاستبدالها بها (على التوالي) ، و يعيد لنا التابع مصفوفة من الكلمات المنقحة.
مثال على ذلك:
يمكن للأشخاص الذين يستخدمون التطبيق Smart Form للبريد الإلكتروني أن يستخدموا كلمات ملونة كنوع من لفت النظر إلى وجود شكوى معينة ، ونحن كمبرمجين لا نريد للإدارة في شركة بوب أن تتعرض للإساءة بهذه الطريقة ، لذا نقوم بإنشاء مصفوفة  offcolor$  تحتوي على عدد من
الكلمات المسيئة ونكتب الكود التالي:
$feedback = str_replace($offcolor, ‘%!@*’, $feedback);
حيث يقوم التابع str_replace()  هنا باستبدال الكلمات السيئة الموجودة في تعليقات الزبون بالرموز المحددة بالوسيط الثاني.
التابع substr_replace() يقوم باستبدال سلسلة معينة جزئية بسلسلة بأخرى ، على أن يبدأ الاستبدال اعتباراً من موضع معين يتم تحديده ضمن الاستدعاء ، وله الشكل العام التالي:
string substr_replace(string string, string replacement,int start, int [length] );

يقوم التابع باستبدال جزء من السلسلة   string  بالسلسلة  replacement ، والجزء الذي يتم استبداله يعتمد على قيمة البداية  start  و الطول length وهو اختياري.
القيمة  start  تمثل مقدار الإزاحة في السلسلة string لتحديد نقطة بداية الاستبدال ، فإذا كان صفراً أو موجباً تكون الإزاحة من بداية السلسلة ، وإذا كان سالباً تكون الإزاحة من نهاية السلسلة.
مثال على ذلك:
$test = substr_replace ($test, ‘X’, -1);
يستبدل هذا الكود الحرف الأخير من السلسلة  test  بالحرف ‘X’
القيمة length  اختيارية وتمثل النقطة التي يتوقف عندها الاستبدال ، وفي حال عدم تحديد هذه القيمة يستمر الاستبدال إلى نهاية السلسلة الأصلية  string ، وفي حال كانت له القيمة صفر سيتم استبدال كامل السلسلة الحالية بالسلسلة الجديدة ، وفي حال كان موجباً فهو يمثل عدد المحارف التي نريد استبدالها من السلسلة الأصلية ، أما إذا كان سالباً فهو يمثل النقطة التي نريد أن يتوقف عندها الاستبدال محسوبة من نهاية السلسلة الأصلية.





مروان المعلم / ماجستير بالاقتصاد المالي والنقدي
كاتب المقالة
كاتب ومحرر اخبار اعمل في موقع آفاق .

جديد قسم : استخدام لغة PHP

إرسال تعليق