سنكمل الآن ما تعلمناه في الدرس السابق عن السلاسل النصية.
وقد كان محتوى الدرس الأول كالآتي:
- إنشاء والوصول إلى السلاسل النصية باستخدام $ و {}، واستخدام الدالة strlen().
-
البحث في السلاسل النصية باستعمال الدوال:
- strstr()
- strpos() و strrpos()
- substr_count()
- strpbrk()
-
الاستبدال في السلاسل النصية باستخدام الدوال:
- str_replace()
- ()substr_replace
- ()strtr
- strtr()
-
التعامل مع حالات الحروف الكبيرة (uppercase) والصغيرة (lowercase) باستخدام الدوال:
- strtolower()
- strtoupper()
- ucfirst()
- lcfirst()
- ucword()
- النسخ غير الحساسة لحالة الأحرف لجميع الدوال السابقة.
أما هذا الدرس فسيحتوي على ما يلي:
- تنسيق السلاسل النصية باستخدام printf()، بما في ذلك تعيين دقة الأرقام العشرية.
-
إزالة الفراغات (trimming) من أطراف السلاسل النصية باستعمال الدوال:
- trim()
- ltrim()
- rtrim()
-
إضافة حواشي (paddings) للنصوص باستعمال الدوال:
- str_pad()
- STR_PAD_RIGHT
- STR_PAD_LEFT
- STR_PAD_BOTH
- التفاف (wrapping) النصوص عبر استعمال الدالة wordwrap().
- تنسيق الأرقام باستخدام الدالة number_format().
- الوقت والتاريخ.
تنسيق السلاسل النصية
الدالة printf()
الدالة printf() هي أداةٌ قويةٌ تمكِّنك من تنسيق السلاسل النصية بطرقٍ مختلفة، تأخذ printf() وسيطًا يُسمى سلسلة التنسيق (format string) يُتبَع عادةً بوسيطٍ اختياري أو أكثر يحتوي على السلسلة أو السلاسل التي ستوضع في السلسلة السابقة، ثم ستطبع هذه الدالة النتيجة النهائية.
سلسلة التنسيق تحتوي على نصٍ عادي وفيه مُحدِّدات التنسيق (conversion specifications)، يتطلب وجود كل محدد تنسيق وسيطًا إضافيًا يُمرَّر إلى printf()، ومهمته هي تنسيق ذاك الوسيط ووضعه في سلسلة التنسيق، ثم بعد ذلك ستُعرَض السلسلة النهائية المُنسَّقة؛ تبدأ محددات التنسيق دومًا بإشارة النسبة المئوية (%)، ربما يبدو الأمر معقدًا للوهلة الأولى، لكن مثالًا بسيطًا كهذا سيجعل إيصال الفكرة أمرًا هينًا:
<?php // الناتج: "Pi rounded to a whole number is: 3" printf( "Pi rounded to a whole number is: %d", M_PI ); ?>
إن عبارة "Pi rounded to a whole number is: %d" هي سلسلة التنسيق، و "%d" ضمن السلسلة السابقة هي محدد للتنسيق، وفي هذه الحالة، يُخبِر هذه المحدد الدالة printf() أن تقرأ الوسيط الإضافي وتضعه -بعد تنسيقه كعدد صحيح- في سلسلة التنسيق؛ الوسيط الإضافي هو الثابت M_PI الموجود في لغة PHP، التي يُمثِّل القيمة التقريبية للعدد π بعدد معيّن من المنازل العشرية (14 منزلة افتراضيًا)؛ أي أنَّ النتيجة النهائية لاستدعاء الدالة السابقة هي طباعة سلسلة التنسيق مع استبدال "%d" بقيمة الثابت π مُقرَّبًا إلى أقرب عدد صحيح.
المزيد من المُحدِّدات:
- b: معاملة الوسيط كعدد صحيح (integer) وتنسيقه كعدد ثنائي.
- c: معاملة الوسيط كعدد صحيح وتنسيقه كمحرف بنظام ASCII الذي يحمل نفس القيمة العددية.
- d: معاملة الوسيط كعدد صحيح وتنسيقه كعدد عشري مع إشارة (signed).
- e: تنسيق الوسيط بالطريقة العلمية (مثلًا، 3.45e+2).
- f: تنسيق الوسيط كعدد ذو فاصلة عائمة (floating point)، آخذًا بالحسبان إعدادات «المحليّة» (locale) الحالية (على سبيل المثال، تستعمل بعض الدول الأوروبية الفاصلة كعلامة تفصل الأرقام الصحيحة عن الأرقام العشرية عوضًا عن النقطة؛ أي 3,14 بدلًا من 3.14).
- F: تنسيق الوسيط كعدد ذو فاصلة عائمة بغض النظر عن إعدادات المحليّة.
- o: معاملة الوسيط كعدد صحيح وتنسيقه كعدد بالنظامي الثماني.
- s: تنسيق الوسيط كسلسلة نصيّة.
- u: معاملة الوسيط كعدد صحيح وتنسيقه كعدد عشري دون إشارة (unsigned).
- x: معاملة الوسيط كعدد صحيح وتنسيقه كعدد بالنظام الست عشري بأحرفٍ ذات الحالة الصغيرة (lowercase).
- X: معاملة الوسيط كعدد صحيح وتنسيقه كعدد بالنظام الست عشري بأحرفٍ ذات الحالة الكبيرة (uppercase).
- %: إظهار إشارة النسبة المئوية (%)، لا يتطلب هذا المُحدِّد وجود وسيط إضافي.
إضافة حواشي إلى المخرجات
يمكنك إضافة محارف إلى يسار (افتراضيًا) أو إلى يمين الوسيط الذي يتم تنسيقه كي يُصبِح بعرضٍ معيّن، وهذا مفيدٌ إن أردت أن تُضيف أصفارًا تسبِق الأعداد، أو أن تحاذي عدِّة سلاسل نصية أفقيًا عبر إضافة فراغات على جوانبها.
<?php // الناتج: "000123" printf( "%06d<br/>", 123 ); // الناتج: "004567" printf( "%06d<br/>", 4567 ); // الناتج: "123456" printf( "%06d<br/>", 123456 ); ?>
دقة الأرقام
عندما تُظهِر الأعداد ذات الفاصلة العائمة باستخدام المحدِّد f أو F، يمكنك استعمال مُحدِّد لدقة الأرقام لتعيين عدد المنازل العشرية التي سيُقرَّب (أو يدوَّر) إليها الرقم. لإضافة مُحدِّد دقة الأرقام، أضف نقطة (.) يلحقها عدد المنازل العشرية التي ستستخدم، قبل مُحدِّد النوع؛ انظر إلى المثال الآتي للتوضيح:
<?php // الناتج: "123.456700" (الدقة الافتراضية) printf( "%f<br />", 123.4567 ); //الناتج : "123.46" printf("%.2f<br />", 123.4567 ); // الناتج: "123" printf("%.0f<br />", 123.4567 ); // الناتج: "123.4567000000" printf("%.10f<br />", 123.4567 ); ?>
يمكنك استخدام مُحدِّد الحاشية مع مُحدِّد الدقة، في حال أردت أن يكون طول الرقم معينًا (بما في ذلك الأرقام بعد الفاصلة العشرية، والفاصلة نفسها أيضًا):
<?php // الناتج: "123.46" printf( "%.2f<br />", 123.4567 ); // الناتج: "000000123.46" printf( "%012.2f<br />", 123.4567 ); // الناتج: " 123.4567" printf( "%12.4f<br />", 123.4567 ); ?>
إزالة الفراغات من أطراف السلاسل النصية
قد لا ترغب في بعض الأحيان بوجود أيّة فراغات قبل أو بعد السلسلة النصية، وفي هذه الحالة نستعمل هذه الدوال:
- trim(): إزالة الفراغات (white-space) من بداية ونهاية السلسلة النصية.
- ltrim(): إزالة الفراغات من بداية السلسلة النصية فقط.
- rtrim(): إزالة الفراغات من نهاية السلسلة النصية فقط.
انظر إلى ناتج المثال الآتي للتوضيح:
<?php echo trim(" hsoub "); echo ltrim(" hsoub "); echo rtrim(" hsoub "); ?>
إضافة حواشي إلى النصوص
لقد رأينا سابقًا كيف يمكننا استخدام الدالة printf() لإضافة حواشي إلى بداية أو نهاية سلسلة نصيّة؛ لكن لغة PHP توفِّر دالةً مخصصةً لهذا الأمر اسمها str_pad()، وهي أكثر مرونةً من printf() وأسهل استخدامًا.
لاستعمال الدالة str_pad()، مرِّر السلسلة التي ستتم إضافة الحواشي إليها، وعرض السلسلة النهائي، وستعيد الدالة السلسلة وقد تمت إضافة فراغات إلى يمينها (افتراضيًا):
<?php echo '<pre>'; echo str_pad( "Hello, world!", 20 ); // الناتج: "Hello, world! " echo '</pre>'; ?>
ولإضافة محارف أخرى غير الفراغ كحاشية، فمرِّر سلسلةً نصيةً كوسيطٍ ثالثٍ اختياري، لاحظ أنَّك تستطيع استخدام محرف وحيد أو أكثر من محرف؛ وفي الحالة الأخيرة، ستُكرَّر السلسلة النصية حسب العرض المُحدَّد:
<?php // الناتج: "Hello, world!*******" echo str_pad( "Hello, world!", 20, "*" ) . "\n"; // الناتج: "Hello, world!1231231" echo str_pad( "Hello, world!", 20, "123" ) . "\n"; ?>
يمكنك جعل الدالة str_pad() تضع الحاشية على يسار السلسلة النصية، أو على يمنيها ويسارها معًا؛ وذلك بتمرير وسيط ثالث اختياري يحتوي على ثوابت الدالة المذكورين في الجدول الآتي:
- STR_PAD_RIGHT: إضافة الحاشية على اليمين (الحالة الافتراضية)، مما يحاذي السلسلة النصيّة إلى اليسار.
- STR_PAD_LEFT: إضافة الحاشية على اليسار، مما يحاذي السلسلة النصيّة إلى اليمين.
- STR_PAD_BOTH: إضافة الحاشية على الطرفين الأيمن والأيسر معًا، مما يؤدي إلى توسيط السلسلة النصية ما أمكن.
مثال: (لاحظ وجود 3 محارف للحاشية على اليسار، و4 على اليمين؛ إذ لا يمكن توسيطها تمامًا):
<?php // الناتج: "***Hello, world!****" echo str_pad( "Hello, world!", 20, "*", STR_PAD_BOTH ) . "\n"; ?>
التفاف النصوص
أحيانًا يكون عندك نصٌ طويلٌ مثل رسائل البريد الإلكتروني أو المقالات، وربما تريد أن تُقسَّم الأسطر بعرضٍ مختلف. تفعل الدالة wordwrap() هذا الأمر؛ يمكنك تحديد عدد المحارف في السطر عبر هذه الدالة، انظر إلى هذا المثال أولًا:
<?php $myString = "this is my string which is very long. it is containing five lines and a number of white spaces"; echo wordwrap ($myString); echo "<br><br><br>"; echo wordwrap ($myString, 40); echo "<br><br><br>"; echo wordwrap ($myString, 40, "<br />"); ?>
لاحظ النتيجة بنفسك بفتح مصدر صفحة الويب ورؤية النتيجة لمختلف الجمل بقيمٍ مختلفة للوسيط الثاني (غير 40، مثل 10، أو 15، أو 20 ...إلخ.).
تنسيق الأعداد
تُستعمَل الدالة number_format() لتنسيق الأعداد، وتستقبل وسيطًا أو وسيطين أو أربعة وسائط.
- أول وسيط هو العدد الذي سيُنسَّق
- الوسيط الثاني هو عدد المنازل العشرية
- الوسيط الثالث هو المحرف الذي سيفصل بين الأعداد الصحيحة والأرقام العشرية
- أما رابع وسيط، فيُحدِّد المحرف الذي سيفصل بين الآلاف في الأعداد الصحيحة
يوضَّح ما سبق بالمثال الآتي:
<?php $myNumber = 12344555.3453; // الناتج: 1,23,44,555.3453 echo number_format($myNumber); echo "<br>"; // الناتج: 1,23,44,555.34 echo number_format($myNumber,2); echo "<br>"; // الناتج: 1 23 44 555,3453 echo number_format($myNumber,2,',',' '); echo "<br>"; ?>
الوقت والتاريخ
يلزم الحصول على الوقت والتاريخ وعرضه بطريقة مناسبة كثيرًا في تطوير الويب، ولهذا توفِّر PHP الأدوات اللازمة لذلك. أهم تلك الأدوات هي الدالة date() التي تقبل سلسلةً نصيةً تُحدِّد تنسيق المخرجات، وتتألف من محارف التنسيق الآتية:
- d: يعيد رقم اليوم من الشهر، وتتراوح قيمته من 01 إلى 31. استخدام المحرف j للحصول على رقم اليوم دون 0 بادئة.
- m: يعيد رقم الشهر، وتتراوح قيمته من 01 إلى 12. استخدام المحرف n للحصول على رقم الشهر دون 0 بادئة.
- w: الحصول على رقم اليوم من الأسبوع، وتتراوح قيمته بين 0 الذي يشير إلى يوم الأحد، و6 ليوم السبت.
- h: الحصول على الساعة الحالية بنظام 12 ساعة. استخدم g للحصول على الساعة بنظام 24 دون 0 بادئة. استخدام a للحصول على am أو pm، و A للحصول على AM أو PM.
- H: الحصول على الساعة الحالية لكن بنظام 24 ساعة. استخدم G للحصول على الساعة بنظام 24 دون 0 بادئة.
- i: الحصول على الدقائق.
- s: الحصول على الثواني.
- Y: الحصول على السنة على هيئة أربعة أرقام.
ويمكن تمرير وسيطٍ اختياري هو بصمة الوقت (timestamp) لكي تُعيد الدالة date() قيمة التاريخ والوقت لها، لكن إن لم تُحدِّد بصمة الوقت، فستؤخذ القيمة من ناتج الدالة time() التي تُعيد بصمة الوقت مقاسةً بالثواني منذ بداية وقت يونكس (Unix Time) (أي منتصف ليلة رأس السنة عام 1970).
<?php // الناتج: 12:31:55 echo date('H:i:s'); // الناتج: 2015/12/23 echo date('Y/m/d'); ?>
ملاحظة: يجدر بالذكر أنَّ الدالة mktime() تنُشِئ بصمة الوقت لتاريخ معيّن كي تستعملها مع الدالة date، شكلها العام هو الآتي:
mktime($hour, $minute, $second, $month, $day, $year);
حيث أول وسيط هو الساعة، والثاني هو الدقيقة، والثالث هو الثانية، والرابع هو الشهر، والخامس هو اليوم من الشهر، والسادس هو السنة؛ مثالٌ عن استعمالها:
<?php // الناتج هو مثلًا: 1450872238 $current_time = time(); echo $current_time; // ناتج بصمة الوقت هو: 1030134920 $past_time = mktime(22, 35, 20, 8, 23, 2002); echo $past_time; // الناتج هو: 12-23-2015 13:03 // يمكن أن نحذف الوسيط الثاني، لأن الدالة date ستعتمد الوقت الحالي المُعادة من الدالة time افتراضيًا echo 'current date is: ' . date ('m-d-Y H:i' , $current_time); // الناتج هو: 08-23-2002 22:35 // يمكن أن نحذف الوسيط الثاني، لأن الدالة date ستعتمد الوقت الحالي المُعادة من الدالة time افتراضيًا echo 'a date in the past: ' . date ('m-d-Y H:i' , $past_time); ?>
تمرين
اكتب برنامجًا يأخذ تاريخ ميلاد المستخدم ثم يُظهِر عمره بالسنوات والأشهر والأيام؛ مثلًا: 35 سنة، و 4 أشهر، و23 يومًا.
المصادر
- مقال Strings in PHP part-2 لصاحبه Harish Kumar.
- صفحة sprintf، و date في دليل PHP وغيرها.
أفضل التعليقات
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.