في هذا الدرس 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
$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
$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
$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 تنسيق القائمة.
<?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
$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 characters | mb_strlen("Café") | 4 |
str_contains($s, $sub) | Boolean substring check | str_contains("php8", "8") | true |
substr($s, $start, $len) | Extract slice by offset | substr("ABCDEF", -2) | "EF" |
str_replace($a, $b, $s) | Replace all matches | str_replace("_", "-", "a_b") | "a-b" |
sprintf($fmt, ...$vals) | Template formatting | sprintf("%.2f", 9.5) | "9.50" |
<?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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم الوصول للمحارف وحساب الطول بـ strlen و mb_strlen للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم البحث النصي بـ str_contains و str_starts_with و strpos وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
لماذا تُرجع strlen() رقماً أكبر من mb_strlen() عند فحص النصوص العربية أو المشكّلة بترميز UTF-8؟
في ترميز UTF-8 يشغل الحرف العربي بايتين، فتحسب strlen() البايتات بينما تحسب mb_strlen() الأحرف.
لماذا يجب مقارنة نتيجة strpos($text, $word) باستخدام !== false بدلاً من المقارنة غير الصارمة؟
تُرجع strpos() الرقم 0 إذا كان النص المبحوث عنه في بداية السلسلة تماماً.
ماذا تُرجع الدالة substr("CloseTag", -3)؟
الفهرس السالب بدون تحديد طول يقتطع آخر 3 أحرف من السلسلة.
أي دالة تنفذ استبدالاً نصياً غير حساس لحالة الأحرف (الكبيرة والصغيرة) في PHP؟
الحرف i في str_ireplace() يرمز لتجاهل حالة الأحرف عند الاستبدال.
ماذا تُرجع الدالة str_pad("7", 4, "0", STR_PAD_LEFT)؟
تحشو السلسلة من اليسار بالصفر "0" حتى يصل إجمالي طولها إلى 4 أحرف.
أي رمز تنسيق في دالة sprintf() ينسق العدد العشري بدقة خانتين عشريتين بالضبط؟
ينسق الرمز %.2f العدد العشري مع رقمين بالضبط بعد الفاصلة العشرية.
ما ناتج التعبير implode("-", explode(",", "a,b,c"))؟
تقسم explode() النص عند الفواصل وتعيد implode() دمجه بالواصلة "-".
لماذا يجب تجنب إجراء عمليات حسابية مباشرة على القيمة المُرجعة من number_format(1500.5, 2)؟
النصوص التي تحتوي فواصل آلاف لا تعتبر نصوصاً رقمية صالحة للحساب في PHP 8.