php 101 السلاسل النصية (Strings) في PHP – القسم الأول


عبد اللطيف ايمش

سنبدأ الآن في تعلم التعامل مع السلاسل النصية وما هي العمليات التي تُجرى عليها.

strings-in-php.png.42dce12a3b0916427b1fa

ولمّا كان الحديث عن السلاسل النصيّة يحتاج شرحًا طويلًا، فقد قسمناها إلى قسمين، لنأخذ فكرةً عن محتواهما:

القسم الأول: 

  1. إنشاء والوصول إلى السلاسل النصية باستخدام $ و {}، واستخدام الدالة strlen()‎.
  2. البحث في السلاسل النصية باستعمال الدوال:
    • strstr()‎
    • strpos()‎ و strrpos()‎
    • substr_count()‎
    • strpbrk()‎
  3. الاستبدال في السلاسل النصية باستخدام الدوال:
    •  str_replace()‎
    • ()substr_replace
    • ()strtr
    • strtr()‎
  4. التعامل مع حالات الحروف الكبيرة (uppercase) والصغيرة (lowercase) باستخدام الدوال:
    • strtolower()‎
    • strtoupper()‎
    • ucfirst()‎
    • lcfirst()‎
    • ucword()‎
  5. النسخ غير الحساسة لحالة الأحرف لجميع الدوال السابقة.

القسم الثاني:

  1. تنسيق السلاسل النصية باستخدام printf()، بما في ذلك تعيين دقة الأرقام العشرية.
  2. إزالة الفراغات (trimming) من أطراف السلاسل النصية باستعمال الدوال:
    •  trim()‎
    • ltrim()‎
    • rtrim()‎
  3. إضافة حواشي (paddings) للنصوص باستعمال الدوال:
    • str_pad()‎
    • STR_PAD_RIGHT
    • STR_PAD_LEFT
    • STR_PAD_BOTH
  4. التفاف (wrapping) النصوص عبر استعمال الدالة wordwrap()‎.
  5. تنسيق الأرقام باستخدام الدالة number_format()‎.
  6. الوقت والتاريخ.

لماذا علي أن أتعلم عن السلاسل النصية؟

لأنه علينا -عند تطوير الويب- أن نحصل على البيانات من المستخدم؛ التي تكون في غالب الأحيان على شكل سلاسل نصيّة. لذا علينا أن نُرشِّح (filter) تلك البيانات لأغراضٍ أمنية، وذلك عبر التعلم عن كيفية التعامل مع السلاسل النصية.

إنشاء السلاسل النصية والوصول إليها

كما تعلم مسبقًا، نُعرِّف السلاسل النصية بكتابة النصوص ضمن علامتي اقتباس مفردتين أو مزدوجتين، وبإسنادها إلى متغير:

$string = 'string';

أو:

$string = "string";

سيتم تفسير أيّة متغيرات ترد ضمن السلاسل النصية بقيمة ذاك المتغير إن كانت السلسلة النصية محاطة بعلامتَي اقتباس مزدوجتين، وإلا فلن تُفسَّر تلك المتغيرات. أي أننا نستطيع أن نضع المتغيرات مباشرةً في السلاسل النصيّة كالآتي:

<?php

$site = 'academy.hsoub.com';

// الناتج هو:
// Please visit academy.hsoub.com
echo "Please visit $site";

// مثالٌ أكثر «تعقيدًا»‏
$cat = "cat";

// {} تشير إلى اسم المتغير
// الناتج هو:
// these are cats
echo "these are {$cat}s";

?>

يمكننا "تهريب" (escape) بعض المحارف الخاصة، لكن لاحظ أنَّ المحارف الخاصة لا يمكن تهريبها إذا كانت ضمن علامتي اقتباس مفردتين، إذ تعمل مع علامات الاقتباس المزدوجة فقط.

<?php

$site = 'academy.hsoub.com';
// \n هو محرف السطر الجديد
/* ستحصل على مخرجات كما يلي في المتصفح:
string academy.hsoub.com

أما لو نظرت إلى مصدر الصفحة، فستجد شيئًا شبيهًا بما يلي:
string
academy.hsoub.com

ذلك ﻷن HTML لا تأخذ الفراغات بعين الاعتبار،
لكن ذلك مفيدٌ في PHP

*/

echo "string\n $site";

?>

ملاحظة: إذا أردت تضمين علامة اقتباس مفردة داخل سلسلة نصية محاطة بعلامتي اقتباس مفردتين، فعليك «تهريبها» عبر وضع شرطة خلفية مائلة (\) قبلها:

echo 'chars\' escaping';

معرفة طول سلسلة نصية

يمكن الحصول على طول السلاسل النصية باستعمال الدالة strlen()‎، حيث تأخذ وسيطًا وحيدًا هو السلسلة النصية، وتُعيد (returns) طول تلك السلسلة.

<?php

$site = 'academy.hsoub.com';

// الناتج هو 17
echo strlen($site).'</br>';

// الناتج هو 14 (بما في ذلك الفراغات)
echo strlen('it is a string');

?>

ملاحظة: من المثير للاهتمام أنَّك تستطيع الوصول إلى المحارف (characters) في سلسلة نصيّة بكتابة ‎$myname[0]، أو ‎$myname[1] وهلّم جرًا إلى نهاية السلسلة النصية؛ هذه هي طريقة الوصول إلى عناصر المصفوفات، التي سنأخذها في درسٍ لاحق.

البحث في السلاسل النصية

تأخذ الدوال التي تبحث عن السلاسل النصية وسيطين، أولهما هو السلسلة التي ستبحث فيها، وثانيهما هو النص التي ستبحث عنه في تلك السلسلة. إن لم يُعثر على النص فستعيد تلك الدوال القيمة false؛ يلخِّص هذا الجدول أبرز تلك الدوال:

  • strstr()‎: إن عُثِرَ على النص، فستعيد الدالة strstr()‎ قسمًا من السلسلة النصية يبدأ من مكان العثور على النص إلى نهاية السلسلة.
  • strpos()‎: تستعمل هذه الدالة للعثور على مكان وجود النص المُطابَق انطلاقًا من بداية السلسلة النصية، وستعيد مكانه.
  • strrpos()‎: هذه الدالة شبيهة بالدالة السابقة strpos()‎ إلا أنها تبدأ البحث من النهاية.
  • substr_count()‎: تحصي عدد مرات مطابقة النص الذي نبحث عنه في السلسلة النصية.
  • strpbrk()‎: التحقق من وجود الحرف في السلسلة النصية وستعيد السلسلة النصية التي تلي ذاك الحرف.

ملاحظة: كل تلك الدوال السابقة (باستثناء substr_count()‎) ستعمل إلى أن تحدث أول مُطابَقة ثم ينتهي تنفيذها؛ فمثلًا، لو بحثنا عن h في "hsoub hosub" فستعيد الدالة strstr('hsoub hsoub', 'h')‎ أول h تمت مطابقتها ثم سينتهي تنفيذها.

انظر إلى المثال الآتي للمزيد من الإيضاح:

<?php

$string = "This is a @str string for a search";

// ستُطبَع الكلمة search
// الجزء من السلسلة النصية التي تبدأ بالقسم sea
echo strstr($string, 'sea').'</br>';

// ستُطبَع الكلمة earch
// الجزء من السلسلة النصية التي تبدأ بالقسم ear
echo strstr($string, 'ear').'</br>';

// سيُطبَع الرقم 8
// الذي هو موضع أول حرف 'a'
// تذكر أنَّ العد يبدأ من الصفر وليس الواحد
echo strpos($string, 'a').'</br>';

// سيُطبَع الرقم 30
// الذي هو موضع آخر حرف 'a'
echo strrpos($string, 'a').'</br>';

// سيُطبَع الرقم 3
// عدد أحرف 'a' في السلسلة النصية
echo substr_count($string, 'a').'</br>';

// ستُطبَع الجملة @str string for a search
// التي تكون بعد محرف @ (بما فيها محرف @)
echo strpbrk($string, '@').'</br>';

?>

الاستبدال في السلاسل النصية

  • str_replace()‎: استبدال جميع أماكن ورود النص الذي نبحث عنه في السلسلة النصية.
  • substr_replace()‎: استبدال القسم المُحدَّد من السلسلة الهدف بسلسلةٍ أخرى.
  • strtr()‎: استبدال محارف معيّنة في السلسلة الهدف بمحارف أخرى.

لنلقِ الآن نظرةً على كل دالةٍ على حدة.

الدالة str_replace()‎

تأخذ هذه الدالة ثلاثة وسائط: أولها هو السلسلة التي سنبحث عنها، وثانيها هي السلسلة التي سيتم الاستبدال بها، وثالثها هي السلسلة التي سنبحث فيها. وستعيد هذه الدالة نسخةً من السلسلة الأصلية مع استبدال جميع أماكن ورود السلسلة التي يتم البحث عنها. هذا مثالٌ عنها:

<?php

$myString = "It was the best of times, it was the worst of times,";

// الناتج: "It was the best of bananas, it was the worst of bananas,"
echo str_replace( "times", "bananas", $myString );

?>

إن أردت أن تعرف عدد مرات استبدال السلسلة التي يتم البحث عنها، فمرِّر وسيطًا رابعًا اختيارًا، وسيُسنَد إليه عدد مرات الاستبدال:

<?php

$myString = "It was the best of times, it was the worst of times,";

// الناتج: "It was the best of bananas, it was the worst of bananas,"
echo str_replace( "times", "bananas", $myString, $num ) . "<br/>";

// الناتج: "The text was replaced 2 times."
echo "The text was replaced $num times";

?>

الدالة substr_replace()‎

في حين أنَّ الدالة str_replace()‎ تبحث عن سلسلة نصيّة معينة لاستبدالها، لكن الدالة substr_replace()‎ تستبدل جزءًا مُحدَّدًا من السلسلة الهدف؛ عليك تمرير ثلاثة وسائط لاستعمالها: السلسلة الهدف التي ستُجرى عليها عملية الاستبدال، والنص الذي سيتم وضعه بدلًا من السلسلة المُستبدَلة، والفهرس (index، أي المكان) الذي ستبدأ منه عملية الاستبدال.

تستبدل الدالة subsrt_replace()‎ جميع المحارف من نقطة البداية إلى نهاية السلسلة النصية، وتعيد نسخةً مُعدَّلةً من السلسلة (أي أنَّ السلسلة الأصلية ستبقى على حالها دون أن يُعدَّل فيها شيء)؛ يوضِّح هذا المثال طريقة عمل الدالة substr_replace()‎:

<?php

$myString = "It was the best of times, it was the worst of times,";

// الناتج: "It was the bananas"
echo substr_replace( $myString, "bananas", 11 );

?>

يمكنك أن تلاحظ أنَّ الشيفرة السابقة استبدلت جميع محتويات السلسلة النصية الأصلية بدءًا من الفهرس index) 11) إلى النهاية بالنص "bananas"؛ إن لم تكن تريد استبدال كل النص من نقطة البداية إلى نهاية السلسلة النصية، فيمكنك تحديد وسيط رابع اختياري يحتوي عدد المحارف التي ستُستبدل:

<?php

$myString = "It was the best of times, it was the worst of times,";

// الناتج: "It was the best of bananas, it was the worst of times,"
echo substr_replace( $myString, "bananas", 19, 5 );

?>

الدالة strtr()‎

يمكنك أيضًا استخدام الدالة srttr()‎ لاستبدال سلاسل نصية بسلاسل نصية أخرى، عوضًا عن استبدال المحارف بمحارف فقط. عليك تمرير وسيطين لفعل ذلك: السلسلة التي تريد تغييرها، ومصفوفة (array) بأزواج «المفتاح/القيمة» حيث كل «مفتاح» يُمثِّل قيمة السلسلة النصية التي سيتم البحث عنها، وكل قيمة مرتبطة بذاك المفتاح هي السلسلة النصيّة التي ستستبدل تلك المُطابَقة. سنشرح المصفوفات في درسٍ لاحق.

التعامل مع حالات الأحرف

ستأخذ الدوال الآتية وسيطًا وحيدًا الذي هو سلسلةٌ نصيّةٌ؛ ما رأيك أن تتدرب عليها وأن تجربها بنفسك.

  • ()strtolowerجعل كل أحرف السلسلة النصية بأحرفٍ ذات الحالة الصغيرة (lowercase)
  • strtoupper()‎: جعل كل أحرف السلسلة النصية بأحرفٍ ذات الحالة الكبيرة (uppercase)
  • ucfirst()‎: جعل أول حرف من السلسلة النصية حرفًا بالحالة الصغيرة.
  • lcfirst()‎: جعل أول حرف من السلسلة النصية حرفًا بالحالة الكبيرة.
  • ucword()‎: جعل أول حرف من كل كلمة في السلسلة النصية حرفًا بالحالة الكبيرة.

الدوال غير الحساسة لحالة الأحرف

هذه هي نسخٌ من الدوال السابقة التي لا تأخذ حالة الأحرف بعين الاعتبار أثناء عملها:

  • strstr()‎
  • stristr()‎
  • strpos()‎
  • stripos()‎
  • strrpos()‎
  • strripos()‎
  • str_replace()‎
  • str_ireplace()‎

تمرين

قد تحتاج إلى عرض البريد الإلكتروني للأشخاص الذين يضيفون تعليقات في موقعك، لكنك لا تريد أن تُرسَل إليهم رسائل عشوائية… اكتب برنامجًا يبدِّل رمز @ في البريد الإلكتروني إلى [at]، والنقطة في آخر العنوان إلى [dot] أي أنَّ «user.name@domain.com» سيُصبِح «user.name [at] domain [dot] com». (للمساعدة، انظر إلى صفحة دليل strstr في المصادر).

المصادر





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن