السلاسل بالتفصيل
تتميز لغة 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) — وأضف !== لإجراء مقارنة صارمة.📖 ملخص
- لا تقوم علامات الاقتباس المفردة بتحليل المتغيرات/تسلسلات الهروب (تُستخدم للنص العادي)؛ بينما تقوم علامات الاقتباس المزدوجة بذلك (تُستخدم عند تضمين المتغيرات)
- استخدم
.لربط السلاسل و.=لإلحاقها (وليس+) - Heredoc للقوالب متعددة الأسطر (يقوم بتحليل المتغيرات)؛ Nowdoc للنص العادي متعدد الأسطر (لا يقوم بالتحليل)
strlen/strpos/substr/str_replace/trimهي الوظائف الأكثر شيوعًاexplodeيقسم سلسلة إلى مصفوفة؛implodeيدمج مصفوفة في سلسلة- قم دائمًا بمقارنة
strpos()مع!== false— ولا تقم أبدًا بمقارنته معif (strpos())
📝 تمارين
- خذ سلسلة نصية أدخلها المستخدم وقم بمعالجتها: إزالة المسافات البيضاء في بداية السلسلة ونهايتها → تحويل كل الأحرف إلى أحرف صغيرة → استبدال جميع المسافات بعلامات تحتية → إخراج النتيجة.
- استخدم
explodeلتقسيم سلسلة العلامات المفصولة بفواصل إلى مصفوفة، وإزالة التكرارات منها، ثم استخدمimplodeلإعادة تجميعها وعرضها. - اكتب دالة تقبل سلسلة نصية لعنوان بريد إلكتروني وتستخدم
strposوsubstrلاستخراج جزء اسم المستخدم (كل ما يسبق@).



