انتقل إلى محتوى الدرس
الدرس 12
دورة PHP

دوال النصوص المدمجة للبحث والقص والاستبدال والتنسيق في PHPPHP Built-In String Functions Searching Slicing and Formatting

أتقن دوال النصوص المدمجة في PHP 8 للبحث والقص والاستبدال والتنسيق مثل str_contains وsubstr وstr_replace وexplode وstr_pad.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تُخزَّن النصوص في PHP كمصفوفة بايتات؛ لذا تحسب strlen() عدد البايتات الخام، بينما تحسب mb_strlen() عدد الأحرف الفعلية بترميز UTF-8.

  • تشغل أحرف الإنجليزية القياسية (ASCII) بايتاً واحداً، بينما تشغل الأحرف العربية والرموز في UTF-8 من 2 إلى 4 بايتات.
  • فهرسة الأقواس المربعة $word[0] تقرأ البايت الأول، والفهرس السالب $word[-1] يقرأ البايت الأخير.
  • استخدم دائماً mb_strlen($text, "UTF-8") عند التحقق من عدد أحرف مدخلات المستخدم.

الكلمة "Café" بترميز UTF-8 تتكون من 4 أحرف مرئية (نتيجة mb_strlen هي 4)، لكن الحرف é يشغل بايتين فتُرجع strlen() القيمة 5.

مخطط توضيحي: معمل دوال النصوص المدمجة في PHP للبحث والقص والتنسيق
PHP
<?php
$ascii = "CloseTag";
$utf8Word = "Caf\xC3\xA9";

echo "First: " . $ascii[0] . ", Last: " . $ascii[-1] . "\n";
echo "ASCII bytes: " . strlen($ascii) . "\n";
echo "UTF-8 bytes: " . strlen($utf8Word) . "\n";
echo "UTF-8 chars: " . mb_strlen($utf8Word, "UTF-8") . "\n";

توفر PHP 8 دوال فحص منطقية مباشرة وهي str_contains() وstr_starts_with() وstr_ends_with()، إلى جانب strpos() لمعرفة موقع التطابق الرقمي.

  • تُرجع str_contains($haystack, $needle) قيمة منطقية صريحة bool(true) أو bool(false).
  • تفحص الدالتان str_starts_with() وstr_ends_with() بادئات الروابط وامتدادات الملفات بوضوح.
  • تُرجع strpos() رقم الفهرس الصفري لأول تطابق أو false عند عدم وجوده؛ لذا قارن نتيجتها دائماً بـ !== false!

لاحظ أن strpos($endpoint, "https") تُرجع 0 (الموقع الأول)؛ واستخدام !== false يمنع التباس الصفر مع القيمة المنطقية false.

PHP
<?php
$endpoint = "https://closetag.com/api/v1/lessons.json";

var_dump(str_starts_with($endpoint, "https://"));
var_dump(str_ends_with($endpoint, ".json"));
var_dump(str_contains($endpoint, "/api/v1/"));
var_dump(strpos($endpoint, "api"));
var_dump(strpos($endpoint, "https") !== false);

تقتطع الدالة substr($string, $offset, $length) جزءاً من النص بناءً على موقع البايت، بينما تقتطع mb_substr() بأمان بناءً على موقع الحرف في UTF-8.

  • إغفال المعامل الثالث $length يقتطع النص من نقطة البداية $offset حتى نهاية السلسلة.
  • المؤشر السالب $offset (مثل -4) يبدأ العد عكسياً من نهاية السلسلة النصية.
  • الطول السالب $length يستبعد هذا العدد من الأحرف من نهاية الجزء المقتطع.

تلتقط substr($serial, -3) آخر 3 أحرف ("VIP")، بينما تقتطع mb_substr($utf8Title, 0, 4, "UTF-8") أول 4 أحرف "Café" بدقة.

PHP
<?php
$serial = "ORD-2026-9941-VIP";
$utf8Title = "Caf\xC3\xA9Latte";

echo substr($serial, 0, 3) . "\n";
echo substr($serial, 4, 4) . "\n";
echo substr($serial, -3) . "\n";
echo mb_substr($utf8Title, 0, 4, "UTF-8") . "\n";

استخدم str_replace() لاستبدال كل تطابقات نص معين، وsubstr_replace() للاستبدال حسب الموقع، وexplode() مع implode() لإعادة تجميع الفواصل.

  • الدالة str_replace($search, $replace, $subject) حساسة لحالة الأحرف؛ بينما str_ireplace() تتجاهل حالة الأحرف.
  • تستبدل substr_replace($str, "***", 4, 5) شريحة محددة بالموقع والطول داخل النص.
  • دمج implode(" | ", explode(",", $csv)) يقسم النص المفصول بفواصل ويعيد جمعه بفاصل جديد في تعبير واحد.

تحول str_replace() الشرطات السفلية إلى واصلات، وتخفي substr_replace() الأرقام الثمانية الوسطى، وتعيد explode/implode تنسيق القائمة.

مخطط تدفق التنفيذ العملي لقسم الاستبدال النصي بـ str_replace و substr_replace في لغة PHP
PHP
<?php
$slug = "php_string_guide_v1";
$card = "4111222233334444";
$tags = "php,mysql,redis";

echo str_replace("_", "-", $slug) . "\n";
echo substr_replace($card, "********", 4, 8) . "\n";
echo implode(" | ", explode(",", $tags)) . "\n";

قبل حفظ النصوص أو مقارنتها، أزل المسافات والرموز الزائدة من الأطراف عبر trim()، ووحّد حالة الأحرف بـ strtolower()، واحشُ الأكواد الثابتة بـ str_pad().

  • تزيل trim() المسافات من البداية والنهاية (أو رموزاً مخصصة في المعامل الثاني)؛ وتزيل ltrim() من اليسار وrtrim() من اليمين.
  • توحد الدوال strtolower() وstrtoupper() وucfirst() وucwords() حالة الأحرف الإنجليزية.
  • تحشو str_pad($id, 6, "0", STR_PAD_LEFT) أرقام الفواتير والطلبات بالأصفار على اليسار.

تزيل trim($rawEmail, " /") المسافات والشرطة المائلة من الأطراف قبل أن تحول strtolower() البريد إلى أحرف صغيرة.

PHP
<?php
$rawEmail = "  [email protected]/  ";
$cleanEmail = strtolower(trim($rawEmail, " /"));
$invoiceNum = "42";
$paddedId = str_pad($invoiceNum, 6, "0", STR_PAD_LEFT);

echo "Email: $cleanEmail\n";
echo "Invoice: INV-$paddedId\n";

استخدم number_format() لإضافة فواصل الآلاف وتحديد الخانات العشرية للعرض، واستخدم sprintf() لبناء نصوص منسقة بدقة عبر الرموز النائبة مثل %s و%d و%.2f.

  • تُرجع number_format(12450.5, 2, ".", ",") السلسلة النصية المنسقة "12,450.50".
  • تُرجع sprintf() النص المنسق كقيمة (بينما تطبع printf() الناتج مباشرة على الشاشة).
  • أهم رموز التنسيق: %s للنص، و%d للعدد الصحيح، و%04d للعدد المحشو بالأصفار، و%.2f للعدد العشري بخانتين.

تنسق number_format() الرقم 1499.5 ليصبح "1,499.50"، وتدمج sprintf() النص %s والعدد المحشو %02d والسعر المنسق.

الدالةالوظيفة الأساسيةمثال الاستدعاءالقيمة المُرجعة
mb_strlen($s, "UTF-8")Count UTF-8 charactersmb_strlen("Café")4
str_contains($s, $sub)Boolean substring checkstr_contains("php8", "8")true
substr($s, $start, $len)Extract slice by offsetsubstr("ABCDEF", -2)"EF"
str_replace($a, $b, $s)Replace all matchesstr_replace("_", "-", "a_b")"a-b"
sprintf($fmt, ...$vals)Template formattingsprintf("%.2f", 9.5)"9.50"
PHP
<?php
$item = "Cloud Server";
$qty = 3;
$total = 1499.5;

$priceLabel = number_format($total, 2, ".", ",");
$summary = sprintf("Item: %s | Qty: %02d | Total: $%s", $item, $qty, $priceLabel);

echo $summary . "\n";
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

استخدم number_format() لإضافة فواصل الآلاف وتحديد الخانات العشرية للعرض، واستخدم sprintf() لبناء نصوص منسقة بدقة عبر الرموز النائبة مثل %s و%d و%.2f. تُرجع number_format(12450.5, 2, ".", ",") السلسلة النصية المنسقة "12,450.50". تُرجع sprintf() النص المنسق كقيمة (بينما تطبع printf() الناتج مباشرة على الشاشة). أهم رموز التنسيق: %s للنص، و%d للعدد الصحيح، و%04d للعدد المحشو بالأصفار، و%.2f للعدد العشري بخانتين.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 String Functions دوال النصوص المدمجة
أتقن دوال النصوص المدمجة في PHP 8 للبحث والقص والاستبدال والتنسيق مثل str_contains وsubstr وstr_replace وexplode وstr_pad.
للمراجعة
02 Character Access and Multibyte Length الوصول للمحارف وحساب الطول بـ strlen و mb_strlen
المفهوم الأساسي لقسم الوصول للمحارف وحساب الطول بـ strlen و mb_strlen في لغة PHP الحديثة.
للمراجعة
03 Searching with str_contains and strpos البحث النصي بـ str_contains و str_starts_with و strpos
الصياغة البرمجية والتطبيق العملي المباشر لقسم البحث النصي بـ str_contains و str_starts_with و strpos.
للمراجعة
04 Extracting Substrings with substr اقتطاع أجزاء النص عبر substr و mb_substr
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم اقتطاع أجزاء النص عبر substr و mb_substr.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PHP PHP
PHP: Hypertext Preprocessor
لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
للمراجعة
02 CLI CLI
Command-Line Interface
واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
للمراجعة
03 FPM FPM
FastCGI Process Manager
مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
للمراجعة
04 HTML HTML
HyperText Markup Language
لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم الوصول للمحارف وحساب الطول بـ strlen و mb_strlen للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم البحث النصي بـ str_contains و str_starts_with و strpos وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

لماذا تُرجع strlen() رقماً أكبر من mb_strlen() عند فحص النصوص العربية أو المشكّلة بترميز UTF-8؟

في ترميز UTF-8 يشغل الحرف العربي بايتين، فتحسب strlen() البايتات بينما تحسب mb_strlen() الأحرف.

02

لماذا يجب مقارنة نتيجة strpos($text, $word) باستخدام !== false بدلاً من المقارنة غير الصارمة؟

تُرجع strpos() الرقم 0 إذا كان النص المبحوث عنه في بداية السلسلة تماماً.

03

ماذا تُرجع الدالة substr("CloseTag", -3)؟

الفهرس السالب بدون تحديد طول يقتطع آخر 3 أحرف من السلسلة.

04

أي دالة تنفذ استبدالاً نصياً غير حساس لحالة الأحرف (الكبيرة والصغيرة) في PHP؟

الحرف i في str_ireplace() يرمز لتجاهل حالة الأحرف عند الاستبدال.

05

ماذا تُرجع الدالة str_pad("7", 4, "0", STR_PAD_LEFT)؟

تحشو السلسلة من اليسار بالصفر "0" حتى يصل إجمالي طولها إلى 4 أحرف.

06

أي رمز تنسيق في دالة sprintf() ينسق العدد العشري بدقة خانتين عشريتين بالضبط؟

ينسق الرمز %.2f العدد العشري مع رقمين بالضبط بعد الفاصلة العشرية.

07

ما ناتج التعبير implode("-", explode(",", "a,b,c"))؟

تقسم explode() النص عند الفواصل وتعيد implode() دمجه بالواصلة "-".

08

لماذا يجب تجنب إجراء عمليات حسابية مباشرة على القيمة المُرجعة من number_format(1500.5, 2)؟

النصوص التي تحتوي فواصل آلاف لا تعتبر نصوصاً رقمية صالحة للحساب في PHP 8.