السلاسل بالتفصيل

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

1. علامات الاقتباس المفردة مقابل علامات الاقتباس المزدوجة

PHP
<?php
$name = "John";

// Single quotes: literal output — no variable parsing
echo 'Hello, $name';     // Hello, $name (variable not parsed)

// Double quotes: variables and escape sequences are parsed
echo "Hello, $name";     // Hello, John (variable parsed)
echo "Hello, {$name}";   // Hello, John (curly braces clarify the variable boundary — recommended)
?>
ميزة علامات الاقتباس المفردة '' علامات الاقتباس المزدوجة ""
تحليل المتغيرات
يحلل تسلسلات الهروب (\n \t) ❌ (فقط \\ \')
السرعة أسرع قليلاً (بدون تحليل) أبطأ قليلاً
الأنسب لـ النص العادي، قيم التكوين تضمين المتغيرات

▶ مثال: الأقواس المتعرجة توضح حدود المتغيرات

PHP
<?php
$drink = "coffee";
echo "Give me a {$drink} latte";   // Give me a coffee latte ✅
echo "Give me a $drink latte";     // Warning: Undefined variable $drink_latte
// When characters immediately follow a variable, use curly braces
?>
▶ جرّب الكود
💡 نصيحة: عند تضمين المتغيرات داخل علامات الاقتباس المزدوجة، استخدم دائمًا صيغة الأقواس المتعرجة {$var}. فهي الطريقة الأكثر أمانًا وسهولة في القراءة.


2. Heredoc و Nowdoc

عندما تحتاج إلى كتابة سلاسل متعددة الأسطر، فإن Heredoc و Nowdoc أكثر أناقة بكثير من التكرار المستمر لربط علامات الاقتباس المفردة أو المزدوجة:

PHP
<?php
$title = "PHP Tutorial";

// Heredoc: the multi-line equivalent of double quotes (parses variables)
$html = <<<HTML
<div class="header">
    <h1>{$title}</h1>
    <p>This is lesson one</p>
</div>
HTML;

// Nowdoc: the multi-line equivalent of single quotes (no variable parsing)
$config = <<<'CONFIG'
database_host = localhost
database_name = $db_name
CONFIG;
// $db_name is output literally — not parsed

echo $html;
?>
💡 نصيحة: تُعد ميزة Heredoc مثالية لعرض كتل كبيرة من قوالب HTML داخل لغة PHP. يجب أن تكون علامة الإغلاق (HTML; في المثال أعلاه) في بداية السطر دون أي مسافات بيضاء أو تباعد في البداية.


3. ربط السلاسل

تستخدم لغة PHP النقطة . لربط السلاسل (وليس + — فهذه تستخدم في العمليات الحسابية):

PHP
<?php
// Concatenate with .
$greeting = "Hello, " . "World!";
echo $greeting;  // Hello, World!

// Concatenate variables
$name = "John";
echo "Welcome, " . $name;  // Welcome, John

// .= for append concatenation
$text = "PHP";
$text .= " Tutorial";     // Equivalent to $text = $text . " Tutorial"
echo $text;               // PHP Tutorial
?>
🔥 خطأ شائع: في لغة PHP، + تعني عملية الجمع الحسابي؛ أما . فتعني ربط السلاسل. "10" + "5" = 15 (عملية جمع عددية)، بينما "10" . "5" = "105" (ربط سلاسل).


4. الدوال الأساسية للسلاسل

تحتوي لغة PHP على أكثر من 100 دالة مدمجة للعمل مع السلاسل. وفيما يلي الدوال التي ستستخدمها في أغلب الأحيان:

▶ مثال: العمليات الأساسية على السلاسل

PHP
<?php
$str = "Hello PHP World";

// Length
echo strlen($str);            // 16

// Find position (returns false if not found)
echo strpos($str, "PHP");     // 6 (0-based)
var_dump(strpos($str, "Java")); // bool(false)

// Substring
echo substr($str, 6, 3);      // "PHP" (3 chars starting at position 6)
echo substr($str, -5);        // "World" (last 5 characters)

// Replace
echo str_replace("World", "Earth", $str);  // Hello PHP Earth
echo str_ireplace("php", "JS", $str);      // Hello JS World (case-insensitive)

// Trim whitespace
$input = "  hello  ";
echo trim($input);            // "hello" (both sides)
echo ltrim($input);           // "hello  " (left only)
echo rtrim($input);           // "  hello" (right only)

// Case conversion
echo strtoupper("hello");     // HELLO
echo strtolower("HELLO");     // hello
echo ucfirst("hello world");  // Hello world (first letter uppercase)
echo ucwords("hello world");  // Hello World (every word capitalized)
?>
▶ جرّب الكود

5. تقسيم السلاسل ودمجها

PHP
<?php
// explode: string → array (split by delimiter)
$tags = "PHP,MySQL,Redis";
$tagArray = explode(",", $tags);
var_dump($tagArray);  // ["PHP", "MySQL", "Redis"]

// implode / join: array → string (join with delimiter)
$arr = ["apple", "banana", "orange"];
echo implode(", ", $arr);  // apple, banana, orange
echo join(" - ", $arr);    // apple - banana - orange (join is an alias for implode)

// str_split: split by length
$chars = str_split("Hello", 2);
var_dump($chars);  // ["He", "ll", "o"]
?>

6. تنسيق السلاسل

PHP
<?php
// sprintf: formatted string (like C)
$name = "John";
$score = 92.5;
echo sprintf("%s scored %.1f points", $name, $score);  // John scored 92.5 points

// Common format placeholders
// %s — string
// %d — integer
// %f — float
// %.2f — float with 2 decimal places

// number_format: thousands separator formatting
echo number_format(1234567.89, 2);  // 1,234,567.89

// nl2br: newlines → <br> (essential for displaying database text on a web page)
$text = "Line one\nLine two\nLine three";
echo nl2br($text);
// Output: Line one<br>Line two<br>Line three
?>

▶ مثال: عمليات السلسلة المركبة

PHP
<?php
// Scenario: processing a user-entered name
$input = "  John  ";
$name = trim($input);           // Remove whitespace

// Check for forbidden words
if (strpos($name, "admin") !== false) {
    echo "Username cannot contain 'admin'";
} else {
    echo "Welcome, " . strtoupper($name) . "!";  // Welcome, JOHN!
}
// Important: strpos returns a position, and position 0 is a valid value
// Always use !== false to check, never !strpos()
?>
▶ جرّب الكود
🔥 خطأ شائع: تُرجع strpos() القيمة 0 عندما يكون المطابق في الموضع 0، وفي لغة PHP تُرجع 0 == false القيمة true! استخدم دائمًا المقارنة الصارمة !== false للتحقق مما إذا كان قد تم العثور عليه — ولا تستخدم أبدًا if (strpos(...)).

❓ أسئلة شائعة

س متى يجب استخدام علامات الاقتباس المفردة مقابل علامات الاقتباس المزدوجة؟
ج استخدم علامات الاقتباس المفردة عندما لا تحتاج إلى تضمين متغيرات (فهي أسرع قليلاً). استخدم علامات الاقتباس المزدوجة عندما تحتاج إلى متغيرات أو تسلسلات الهروب. بالنسبة لقوالب HTML الكبيرة، استخدم Heredoc.
س ما الفرق بين explode() وstr_split()؟
ج يقوم explode("delimiter", $str) بالتقسيم باستخدام فاصل محدد. أما str_split($str, length) فيقوم بالتقسيم إلى أجزاء ذات طول ثابت.
س تُرجع الدالة strpos القيمة 0، والقيمة 0 تُعتبر «خطأ» في جملة if — ماذا أفعل؟
ج هذه واحدة من أكثر الفخاخ شيوعًا في لغة PHP. استخدم دائمًا if (strpos($haystack, $needle) !== false) — وأضف !== لإجراء مقارنة صارمة.

📖 ملخص

📝 تمارين

  1. خذ سلسلة نصية أدخلها المستخدم وقم بمعالجتها: إزالة المسافات البيضاء في بداية السلسلة ونهايتها → تحويل كل الأحرف إلى أحرف صغيرة → استبدال جميع المسافات بعلامات تحتية → إخراج النتيجة.
  2. استخدم explode لتقسيم سلسلة العلامات المفصولة بفواصل إلى مصفوفة، وإزالة التكرارات منها، ثم استخدم implode لإعادة تجميعها وعرضها.
  3. اكتب دالة تقبل سلسلة نصية لعنوان بريد إلكتروني وتستخدم strpos وsubstr لاستخراج جزء اسم المستخدم (كل ما يسبق @).
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%