التعامل مع النصوص في PHP: أهم دوال النصوص
أغلب ما تفعله مواقع الويب هو التعامل مع نصوص: اسم كتبه مستخدم، وعنوان مقال، وسعر يُعرض بشكل مرتب، وكلمة يبحث عنها زائر. PHP وُلدت للويب، ولذلك فيها عشرات الدوال الجاهزة للنصوص. في هذا الدرس ستتعلم أكثرها استخداماً، مع التركيز على ما يخص النص العربي.
التنظيف وتغيير الحالة
Section titled “التنظيف وتغيير الحالة”المستخدمون يكتبون مسافات زائدة دون قصد، خصوصاً عند النسخ واللصق. الدالة trim تحذف المسافات من بداية النص ونهايته:
<?php$title = " تعلّم PHP بالعربي ";
echo "[" . $title . "]\n";echo "[" . trim($title) . "]\n";echo strtoupper("php") . "\n";echo ucfirst("hello world") . "\n";[ تعلّم PHP بالعربي ][تعلّم PHP بالعربي]PHPHello worldstrtoupper تحوّل الحروف الإنجليزية إلى كبيرة (وعكسها strtolower)، و ucfirst تكبّر الحرف الأول فقط. اجعل trim عادة عندك مع كل قيمة تأتي من نموذج.
البحث داخل النص
Section titled “البحث داخل النص”هل البريد فيه علامة @؟ هل الرابط يبدأ بـ https؟ هذه الدوال تجيب بـ true أو false:
<?php$email = "sara@example.com";
var_dump(str_contains($email, "@"));var_dump(str_starts_with($email, "sara"));var_dump(str_ends_with($email, ".org"));echo strpos($email, "@") . "\n";bool(true)bool(true)bool(false)4أما strpos فتعيد موضع أول ظهور للنص المطلوب، والعدّ يبدأ من صفر.
الاستبدال والقص
Section titled “الاستبدال والقص”str_replace تستبدل كل ظهور لنص بنص آخر. و mb_substr تقص جزءاً من النص: تعطيها موضع البداية وعدد الحروف:
<?php$text = "أحب القهوة في الصباح";
echo str_replace("القهوة", "الشاي", $text) . "\n";echo mb_substr($text, 0, 3) . "\n";echo mb_substr($text, 4, 6) . "\n";echo mb_substr($text, -6) . "\n";أحب الشاي في الصباحأحبالقهوةالصباحالموضع السالب يعدّ من نهاية النص، فـ -6 تعني آخر ستة حروف.
لماذا mb_ مع العربية؟
Section titled “لماذا mb_ مع العربية؟”تعلمت في درس الدوال أن PHP تعدّ البايتات لا الحروف، وأن الحرف العربي بايتان. انظر ماذا يحدث لو استخدمنا الدوال العادية مع نص عربي:
<?php$name = "سارة";
echo strlen($name) . "\n";echo mb_strlen($name) . "\n";echo mb_substr($name, 0, 2) . "\n";echo mb_strtoupper("café") . "\n";84ساCAFÉالدالة substr العادية قد تقص الحرف العربي من منتصفه، فيظهر للزائر رمز غريب مثل �. القاعدة سهلة:
| المهمة | للإنجليزية فقط | لأي لغة (استخدم هذه) |
|---|---|---|
| طول النص | strlen |
mb_strlen |
| قص جزء | substr |
mb_substr |
| موضع نص | strpos |
mb_strpos |
| حروف كبيرة | strtoupper |
mb_strtoupper |
أما str_replace و str_contains و trim و explode فتعمل مع العربية دون مشاكل، لأنها تطابق النص كما هو.
التقسيم والدمج: explode و implode
Section titled “التقسيم والدمج: explode و implode”كثيراً ما تصلك بيانات مفصولة بفواصل، مثل الوسوم التي يكتبها المستخدم. explode تقسم النص إلى مصفوفة، و implode تفعل العكس:
<?php$line = "تفاح,موز,عنب";
$fruits = explode(",", $line);echo count($fruits) . "\n";echo $fruits[1] . "\n";echo implode(" - ", $fruits) . "\n";3موزتفاح - موز - عنبتخيّل explode مثل تقطيع رغيف عند كل فاصل، و implode مثل نظم الخرز في خيط، وأنت تختار شكل الخيط.
تنسيق الأرقام والنصوص
Section titled “تنسيق الأرقام والنصوص”الزائر لا يحب أن يرى سعراً مثل 1234567.891. الدالة number_format تضيف فواصل الآلاف وتحدد عدد الخانات العشرية. و sprintf تبني نصاً من قالب فيه أماكن فارغة:
<?php$price = 1234567.891;$name = "سارة";$score = 9;
echo number_format($price) . "\n";echo number_format($price, 2) . "\n";echo sprintf("الطالبة %s حصلت على %d من 10", $name, $score) . "\n";echo sprintf("%05d", 42) . "\n";echo sprintf("%.1f", 3.14159) . "\n";1,234,5681,234,567.89الطالبة سارة حصلت على 9 من 10000423.1في القالب: %s مكان لنص، و %d لرقم صحيح، و %05d لرقم من خمس خانات تُملأ بالأصفار (مفيد لأرقام الفواتير)، و %.1f لرقم عشري بخانة واحدة.
مثال عملي: مقتطف من مقال
Section titled “مثال عملي: مقتطف من مقال”في صفحات المدونات يُعرض أول المقال فقط وبعده ثلاث نقاط. هذه دالة تفعل ذلك وتحترم النص العربي:
<?phpfunction excerpt(string $text, int $limit = 20): string { $text = trim($text); if (mb_strlen($text) <= $limit) { return $text; } return mb_substr($text, 0, $limit) . "...";}
echo excerpt("درس قصير") . "\n";echo excerpt("هذا مقال طويل جداً عن تعلّم لغة PHP من الصفر") . "\n";درس قصيرهذا مقال طويل جداً ع...جرّب بنفسك
Section titled “جرّب بنفسك”عندك النص " php, html ,CSS, JavaScript " وفيه وسوم كتبها مستخدم بإهمال. اكتب كوداً يقسمه عند الفواصل، ويحذف المسافات حول كل وسم، ويحوّل الكل إلى حروف صغيرة، ثم يطبع الوسوم مفصولة بـ |. تلميح: استخدم explode ثم حلقة foreach أو array_map ثم implode.
php | html | css | javascriptأخطاء شائعة
Section titled “أخطاء شائعة”- استخدام
strlenوsubstrمع العربية: الطول يخرج مضاعفاً، والقص يكسر الحروف. استخدم دوالmb_. - الاعتماد على
strposفي الشرط مباشرة: الموضع0يُعامل كأنهfalse. استخدمstr_contains، أو قارن بـ!== false. - ترتيب معاملات
explode: الفاصل أولاً ثم النص:explode(",", $line). عكسهما خطأ شائع. - نسيان
trimمع مدخلات النماذج: فيفشل تسجيل الدخول بسبب مسافة غير مرئية في آخر البريد.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج mb_strlen('سلام')؟
mb_strlen تعدّ الحروف الفعلية، والكلمة أربعة حروف. أما strlen فكانت ستعيد 8.
سؤال
أي دالة تحوّل النص 'a-b-c' إلى مصفوفة من ثلاثة عناصر؟
explode تقسم النص عند الفاصل وتعيد مصفوفة، و implode تدمج المصفوفة في نص.
الخلاصة
Section titled “الخلاصة”trimتنظف الأطراف، وstr_replaceتستبدل، وstr_containsتبحث.- مع النص العربي استخدم
mb_strlenوmb_substrوباقي دوالmb_. explodeتقسم النص إلى مصفوفة، وimplodeتدمج المصفوفة في نص.number_formatتنسق الأرقام، وsprintfتبني نصاً من قالب.- نظّف مدخلات المستخدم دائماً قبل استخدامها.