تخطَّ إلى المحتوى

التعامل مع النصوص في PHP: أهم دوال النصوص

الدرس 9 من 12 · PHP

أغلب ما تفعله مواقع الويب هو التعامل مع نصوص: اسم كتبه مستخدم، وعنوان مقال، وسعر يُعرض بشكل مرتب، وكلمة يبحث عنها زائر. PHP وُلدت للويب، ولذلك فيها عشرات الدوال الجاهزة للنصوص. في هذا الدرس ستتعلم أكثرها استخداماً، مع التركيز على ما يخص النص العربي.

المستخدمون يكتبون مسافات زائدة دون قصد، خصوصاً عند النسخ واللصق. الدالة trim تحذف المسافات من بداية النص ونهايته:

<?php
$title = " تعلّم PHP بالعربي ";
echo "[" . $title . "]\n";
echo "[" . trim($title) . "]\n";
echo strtoupper("php") . "\n";
echo ucfirst("hello world") . "\n";
الناتج
[ تعلّم PHP بالعربي ]
[تعلّم PHP بالعربي]
PHP
Hello world

strtoupper تحوّل الحروف الإنجليزية إلى كبيرة (وعكسها strtolower)، و ucfirst تكبّر الحرف الأول فقط. اجعل trim عادة عندك مع كل قيمة تأتي من نموذج.

هل البريد فيه علامة @؟ هل الرابط يبدأ بـ 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 فتعيد موضع أول ظهور للنص المطلوب، والعدّ يبدأ من صفر.

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 تعني آخر ستة حروف.

تعلمت في درس الدوال أن PHP تعدّ البايتات لا الحروف، وأن الحرف العربي بايتان. انظر ماذا يحدث لو استخدمنا الدوال العادية مع نص عربي:

<?php
$name = "سارة";
echo strlen($name) . "\n";
echo mb_strlen($name) . "\n";
echo mb_substr($name, 0, 2) . "\n";
echo mb_strtoupper("café") . "\n";
الناتج
8
4
سا
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 مثل نظم الخرز في خيط، وأنت تختار شكل الخيط.

الزائر لا يحب أن يرى سعراً مثل 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,568
1,234,567.89
الطالبة سارة حصلت على 9 من 10
00042
3.1

في القالب: %s مكان لنص، و %d لرقم صحيح، و %05d لرقم من خمس خانات تُملأ بالأصفار (مفيد لأرقام الفواتير)، و %.1f لرقم عشري بخانة واحدة.

مثال عملي: مقتطف من مقال

Section titled “مثال عملي: مقتطف من مقال”

في صفحات المدونات يُعرض أول المقال فقط وبعده ثلاث نقاط. هذه دالة تفعل ذلك وتحترم النص العربي:

<?php
function 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";
الناتج
درس قصير
هذا مقال طويل جداً ع...

عندك النص " php, html ,CSS, JavaScript " وفيه وسوم كتبها مستخدم بإهمال. اكتب كوداً يقسمه عند الفواصل، ويحذف المسافات حول كل وسم، ويحوّل الكل إلى حروف صغيرة، ثم يطبع الوسوم مفصولة بـ |. تلميح: استخدم explode ثم حلقة foreach أو array_map ثم implode.

الناتج
php | html | css | javascript
  • استخدام strlen و substr مع العربية: الطول يخرج مضاعفاً، والقص يكسر الحروف. استخدم دوال mb_.
  • الاعتماد على strpos في الشرط مباشرة: الموضع 0 يُعامل كأنه false. استخدم str_contains، أو قارن بـ !== false.
  • ترتيب معاملات explode: الفاصل أولاً ثم النص: explode(",", $line). عكسهما خطأ شائع.
  • نسيان trim مع مدخلات النماذج: فيفشل تسجيل الدخول بسبب مسافة غير مرئية في آخر البريد.

سؤال

ما ناتج mb_strlen('سلام')؟

سؤال

أي دالة تحوّل النص 'a-b-c' إلى مصفوفة من ثلاثة عناصر؟

  • trim تنظف الأطراف، و str_replace تستبدل، و str_contains تبحث.
  • مع النص العربي استخدم mb_strlen و mb_substr وباقي دوال mb_.
  • explode تقسم النص إلى مصفوفة، و implode تدمج المصفوفة في نص.
  • number_format تنسق الأرقام، و sprintf تبني نصاً من قالب.
  • نظّف مدخلات المستخدم دائماً قبل استخدامها.