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

دوال البحث والاقتطاع النصي ودعم العربية عبر mb_string في PHPPHP String Searching Slicing and Multibyte Substrings

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

تتيح لغة PHP قراءة أو تعديل المحارف المفردة (ASCII) داخل السلسلة النصية باستخدام الفهارس الموجبة التي تبدأ من الصفر $str[0] أو الفهارس السالبة من النهاية $str[-1].

  • يشير الفهرس 0 إلى البايت الأول، ويشير الفهرس السالب -1 إلى البايت الأخير من السلسلة.
  • يمكنك تحديث حرف إنجليزي مفرد في موقعه مباشرة عبر الإسناد: $code[0] = "B";.
  • لا تستخدم فهرسة الأقواس $str[$i] لقراءة أو تعديل الأحرف العربية (UTF-8) لأن القوس المربع يتعامل مع بايت واحد فقط.

قراءة $ticket[0] و$ticket[-1] تجلب الحرفين الأول والأخير، والإسناد المباشر لهما يعدل النص في مكانه إلى "V-9045-Z".

مخطط توضيحي: معمل البحث النصي وتحديد المواقع والاقتطاع متعدد البايت في PHP
PHP
<?php
$ticket = "A-9045-X";

$firstChar = $ticket[0];
$lastChar = $ticket[-1];

$ticket[0] = "V";
$ticket[-1] = "Z";

echo "Original ends: $firstChar .. $lastChar\n";
echo "Updated ticket: $ticket\n";

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

  • الدوال الثلاث حساسة لحالة الأحرف وتُرجع دائماً قيمة منطقية صريحة bool (true أو false).
  • البحث عن نص فرعي فارغ "" يُرجع دائماً true في الدوال الثلاث.
  • لإجراء فحص غير حساس لحالة الأحرف، وحّد النصين أولاً باستخدام strtolower() أو mb_strtolower().

تعبّر كل دالة بوضوح عن الغرض منها وتُرجع bool(true) مباشرة دون الحاجة لمقارنات أرقام الفهارس.

PHP
<?php
$filename = "backup_2026_final.sql.gz";

$isBackup = str_starts_with($filename, "backup_");
$isGzip = str_ends_with($filename, ".gz");
$hasSql = str_contains($filename, ".sql");

var_dump($isBackup, $isGzip, $hasSql);

استخدم strpos() لإيجاد موقع أول ظهور لنص فرعي، واستخدم strrpos() لإيجاد موقع آخر ظهور له داخل السلسلة.

  • تقبل strpos($str, $needle, $offset) معاملاً ثالثاً اختيارياً لبدء البحث من فهرس محدد.
  • تُعد strrpos($path, ".") مثالية للعثور على موقع النقطة الأخيرة قبل امتداد الملف.
  • الدالتان stripos() وstrripos() هما النسختان غير الحساسين لحالة الأحرف.

تجد strpos() النقطة الأولى عند الفهرس 6، وتمرير $firstDot + 1 يجد النقطة الثانية عند 9، بينما تجلب strrpos() النقطة الأخيرة عند 15.

PHP
<?php
$archive = "report.v2.final.pdf";

$firstDot = strpos($archive, ".");
$secondDot = strpos($archive, ".", $firstDot + 1);
$lastDot = strrpos($archive, ".");

echo "First dot: $firstDot\n";
echo "Second dot: $secondDot\n";
echo "Last dot: $lastDot\n";

يتيح دمج strpos() وstrrpos() مع الدالة substr() استخراج أسماء المستخدمين والنطاقات وامتدادات الملفات ديناميكياً مهما اختلف طول النص.

  • تستخرج substr($email, 0, $atPos) كل ما يسبق رمز @ في البريد الإلكتروني.
  • تستخرج substr($email, $atPos + 1) كل ما يلي رمز @ حتى نهاية السلسلة.
  • تقتطع substr($code, 1, -1) النص مع استبعاد الحرف الأول والحرف الأخير في استدعاء واحد.

استخدام موقع $atPos يقتطع اسم المستخدم والنطاق ديناميكياً مهما كان طولهما، وتزيل substr("[TOKEN-88]", 1, -1) القوسين الخارجيين.

مخطط تدفق التنفيذ العملي لقسم اقتطاع النصوص بـ substr والمؤشرات السالبة في لغة PHP
PHP
<?php
$email = "[email protected]";
$atPos = strpos($email, "@");

$user = substr($email, 0, $atPos);
$domain = substr($email, $atPos + 1);
$trimmed = substr("[TOKEN-88]", 1, -1);

echo "User: $user | Domain: $domain\n";
echo "Inner: $trimmed\n";

مع النصوص العربية والعالمية المرمزة بـ UTF-8، استخدم دائماً mb_strpos() وmb_substr() ليتم حساب الفهارس والأطوال بالأحرف الحقيقية وليس بالبايتات الخام.

  • يشغل كل حرف عربي في ترميز UTF-8 بايتين؛ لذا فإن substr($ar, 0, 3) تأخذ 3 بايتات (حرفاً ونصف) فتُتلف الحرف الثاني!
  • تقتطع mb_substr($ar, 0, 3, "UTF-8") أول 3 أحرف عربية كاملة وسليمة.
  • تُرجع mb_strpos($ar, $word, 0, "UTF-8") الفهرس الحرفي الصحيح للتطابق.

الكلمة العربية المكونة من 7 أحرف تشغل 14 بايت في UTF-8؛ وتقتطع mb_substr(..., 0, 2, "UTF-8") أول حرفين عربيين بأمان (4 بايتات).

PHP
<?php
$arabicCity = "\xD8\xA7\xD9\x84\xD9\x82\xD8\xA7\xD9\x87\xD8\xB1\xD8\xA9";

$byteLen = strlen($arabicCity);
$charLen = mb_strlen($arabicCity, "UTF-8");
$prefix = mb_substr($arabicCity, 0, 2, "UTF-8");

echo "Bytes: $byteLen | Chars: $charLen\n";
echo "Prefix bytes: " . strlen($prefix) . "\n";

اختر الدالة الأنسب بين دوال الفحص المنطقي ودوال مواقع البايتات ودوال UTF-8 متعددة البايت عبر هذا الجدول المرجعي.

  • فضّل str_contains() وstr_starts_with() وstr_ends_with() دائماً عندما لا تحتاج لرقم الفهرس.
  • استخدم strpos() وstrrpos() مع !== false عند قص المعرّفات أو المسارات أو الروابط.
  • استخدم mb_strpos() وmb_substr() دائماً عند التعامل مع النصوص البشرية مثل الأسماء والمقالات العربية.

تحدد strrpos($path, "/") موقع الشرطة المائلة الأخيرة لتستخرج substr($path, $slashPos + 1) اسم الملف "profile.png".

الدالةحساسة للأحرفنوع النتيجةآمنة لأحرف UTF-8 العربية
str_contains($h, $n)YesboolYes (exact byte sequence)
strpos($h, $n)Yes (stripos: No)int byte index or falseByte offset only
strrpos($h, $n)Yes (strripos: No)Last int byte index or falseByte offset only
substr($s, $start, $len)N/Astring sliceNo (slices raw bytes)
mb_substr($s, $start, $len)N/Astring sliceYes (slices UTF-8 chars)
PHP
<?php
$path = "/uploads/avatars/profile.png";
$slashPos = strrpos($path, "/");
$file = substr($path, $slashPos + 1);

echo "File: $file\n";
var_dump(str_ends_with($file, ".png"));
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

اختر الدالة الأنسب بين دوال الفحص المنطقي ودوال مواقع البايتات ودوال UTF-8 متعددة البايت عبر هذا الجدول المرجعي. فضّل str_contains() وstr_starts_with() وstr_ends_with() دائماً عندما لا تحتاج لرقم الفهرس. استخدم strpos() وstrrpos() مع !== false عند قص المعرّفات أو المسارات أو الروابط. استخدم mb_strpos() وmb_substr() دائماً عند التعامل مع النصوص البشرية مثل الأسماء والمقالات العربية.

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 String Search & Slice البحث والاقتطاع النصي
ابحث واقتطع النصوص بدقة في PHP 8 باستخدام strpos وsubstr وmb_substr ودوال PHP 8 الحديثة str_contains وstr_starts_with.
للمراجعة
02 Indexing and Updating String Bytes الوصول للمحارف بالمؤشر الموجب والسالب وتحديثها
المفهوم الأساسي لقسم الوصول للمحارف بالمؤشر الموجب والسالب وتحديثها في لغة PHP الحديثة.
للمراجعة
03 Modern Checks with str_contains Family الفحص المباشر بـ str_contains و str_starts_with
الصياغة البرمجية والتطبيق العملي المباشر لقسم الفحص المباشر بـ str_contains و str_starts_with.
للمراجعة
04 Finding Positions with strpos and strrpos تحديد موقع أول وآخر تطابق بـ strpos و strrpos
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم تحديد موقع أول وآخر تطابق بـ strpos و strrpos.
للمراجعة

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

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

الاختصارات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 محلياً ونفّذ المثال البرمجي المشروح في قسم الوصول للمحارف بالمؤشر الموجب والسالب وتحديثها للتحقق من المخرجات.

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

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

مساحة التحدي

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

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

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

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

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

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

ماذا يُرجع التعبير $word[-1] عندما تكون قيمة $word = "Laravel"؟

الفهرس السالب -1 يصل إلى الحرف الأخير من نهاية النص.

02

أي دالة تحدد فهرس آخر ظهور لنص فرعي داخل سلسلة نصية؟

الدالة strrpos() (بحرفي r) تبحث عن موقع آخر تطابق في السلسلة.

03

ماذا تُرجع الدالة substr("[SECRET]", 1, -1)؟

تتخطى البداية 1 القوس الأول "["، ويستبعد الطول السالب -1 القوس الأخير "]".

04

ماذا يحدث إذا استخدمت دالة البايتات substr($arabicText, 0, 5) على نص عربي بترميز UTF-8؟

يشغل الحرف العربي بايتين في UTF-8، فاقتطاع 5 بايتات يقسم الحرف الثالث من منتصفه.

05

أي دالة تقتطع أول 50 حرفاً من ملخص مقال عربي بترميز UTF-8 بأمان؟

تحسب mb_substr() أحرف UTF-8 كاملة دون شطر أي بايت.

06

كيف يعمل المعامل الثالث $offset في الدالة strpos($haystack, $needle, $offset)؟

الرقم المُرجع يكون دائماً محسوباً من بداية النص الأصلي (الفهرس 0).

07

ماذا تُرجع الدالة str_contains("CloseTag", "") عندما يكون النص المبحوث عنه فارغاً؟

في PHP 8 تُرجع دوال الفحص الثلاث دائماً true عند البحث عن نص فارغ "".

08

أي صيغة للوصول إلى حرف داخل النص بالفهرس تمت إزالتها نهائياً في PHP 8.0؟

تم إلغاء دعم الأقواس المعقوفة لفهرسة النصوص في PHP 8.0 واعتماد الأقواس المربعة فقط.