تعيد substr($string, $offset, $length) جزء $string الذي يبدأ عند الموضع $offset (يُعدّ من 0) وطوله $length محرفًا. تعيد substr('Hello world', 0, 5) النص "Hello". احذف $length لتحصل على كل شيء حتى النهاية.
تعدّ substr() البايتات. وهذا مثل عدّ المحارف في النص الإنجليزي، لكن ليس في اليابانية أو الصينية أو الرموز التعبيرية أو الحروف ذات العلامات. لهذه استخدم mb_substr()، المعروضة أدناه.
الصيغة
substr(string $string, int $offset, ?int $length = null): string
$offsetهو مكان البدء.0هو المحرف الأول. والقيمة السالبة تُعدّ من النهاية.$lengthهو عدد البايتات المأخوذة (البايت الواحد محرف واحد في نص ASCII العادي). والقيمة السالبة تترك ذلك العدد من النهاية. وnull(أو حذفه) تعني «حتى النهاية».
الإزاحة والطول السالبان: العمل من النهاية
تبدأ $offset السالبة العد من نهاية النص، لذا فإن -1 هو المحرف الأخير. وتتوقف $length السالبة قبل النهاية بذلك العدد من المحارف.
substr($s, 0, -1) هي الطريقة المعتادة لحذف المحرف الأخير، مثل فاصلة ختامية تركتها حلقة.
الحصول على المحرف الأول أو الأخير
لبايت واحد يمكنك أيضًا الوصول إلى النص بالفهرس مباشرة. $s[0] هو المحرف الأول، ومنذ PHP 7.1 يكون $s[-1] هو الأخير.
الوصول بالفهرس إلى موضع غير موجود يطبع تحذيرًا، بينما تعيد substr() نصًا فارغًا فقط. إذا كان النص قد يكون فارغًا، ففضّل substr().
خارج النطاق: نص فارغ لا false
إذا كانت $offset بعد نهاية النص، تعيد substr() القيمة "" في PHP 8. وفي PHP 7 كانت تعيد false، لذا لم تعد الشيفرات القديمة التي تفحص === false تعمل.
النصوص اليابانية: استخدم mb_substr
يخزّن UTF-8 كل محرف من الكانا والكانجي الشائع في 3 بايتات (ويأخذ الكانجي النادر مثل 𠮷 والرموز التعبيرية 4). تعدّ substr() البايتات، لذا تعيد substr('こんにちは', 0, 3) المحرف こ وحده، والطول الذي لا يقع على حد محرف يقطع محرفًا إلى نصفين وينتج نصًا تالفًا. تأخذ mb_substr() الوسائط نفسها وتعدّ المحارف.
ينطبق الأمر نفسه على الرموز التعبيرية والحروف ذات العلامات مثل é. ويستخدم عدّ المحارف mb_strlen()؛ راجع strlen() للبايتات مقابل المحارف.
اختصار النص مع علامة حذف
قطع عنوان طويل لقائمة أو بطاقة هو أكثر الاستخدامات الحقيقية لـ substr() شيوعًا. استخدم mb_substr() حتى لا يُقطع عنوان ياباني في منتصف محرف أبدًا، ولا تضف ... إلا عندما تكون قد اختصرت شيئًا فعلًا.
تفعل mb_strimwidth($text, 0, $width, '...') الشيء نفسه حسب عرض العرض، حيث يُعدّ المحرف الياباني كامل العرض عمودين والحرف اللاتيني عمودًا واحدًا. وهي تناسب التخطيطات ثابتة العرض.
عدّ نص جزئي بـ substr_count
تعيد substr_count($haystack, $needle) عدد مرات ظهور $needle. وهي حساسة لحالة الأحرف ولا تعدّ التطابقات المتداخلة.
substr مع strpos: النص قبل محرف أو بعده
اجمع substr() مع strpos() للقطع عند محرف لا تعرف موضعه مسبقًا، مثل @ في عنوان بريد إلكتروني:
تحقق من أن strpos() لم تُعد false قبل استخدام نتيجتها: إذا كان المحرف مفقودًا، تُعامل false على أنها 0 دون تحذير، فتعيد substr('nobody', 0, $at) القيمة "" وتعيد substr('nobody', $at + 1) القيمة "obody".
الأسئلة الشائعة
كيف أحصل على آخر محارف نص في PHP؟
استخدم إزاحة سالبة: تعيد substr($s, -3) آخر 3 محارف. وللنصوص التي قد تحتوي محارف يابانية أو متعددة البايتات أخرى، استخدم mb_substr($s, -3).
ما الفرق بين substr وmb_substr؟
تعدّ substr() البايتات وتعدّ mb_substr() المحارف. في UTF-8 يأخذ كل محرف من الكانا والكانجي الشائع 3 بايتات، لذا تقطع substr('日本語', 0, 2) محرفًا إلى نصفين، بينما تعيد mb_substr('日本語', 0, 2) النص "日本".
ماذا تعيد substr إذا كانت البداية بعد نهاية النص؟
نصًا فارغًا. منذ PHP 8.0، تعيد substr('abc', 5) القيمة ""؛ وكانت PHP 7 تعيد false.
كيف أحذف آخر محرف من نص في PHP؟
تعيد substr($s, 0, -1) كل شيء ما عدا آخر بايت. استخدم mb_substr($s, 0, -1) للنصوص متعددة البايتات، أو rtrim($s, ',') إذا لم تكن تريد إلا حذف محرف ختامي معيّن.
كيف أعدّ مرات ظهور نص جزئي في PHP؟
substr_count($haystack, $needle): تعيد substr_count('banana', 'an') القيمة 2. وهي حساسة لحالة الأحرف ولا تعدّ التطابقات المتداخلة.