Menu
flag Ar iconالعربيةdown icon

الدالة strlen() في PHP: طول النص بالبايتات والمحارف

تعيد strlen($string) طول نص بالبايتات؛ وتعيده mb_strlen($string) بالمحارف. تعلّم لماذا تعطي النصوص اليابانية والرموز التعبيرية إجابات مختلفة، وكيف تتحقق من النص الفارغ، وكيف تتحقق من طول المُدخلات.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تعيد strlen($string) طول نص بالبايتات. وللمحارف، وهي ما تريده للنصوص اليابانية والحروف ذات العلامات والرموز التعبيرية، استخدم mb_strlen($string). وفي النص الإنجليزي العادي تعطي الدالتان العدد نفسه.

تُحسب المسافات وعلامات الترقيم والأسطر الجديدة كلها. strlen("a b\n") تساوي 4.

البايتات مقابل المحارف في UTF-8

نصوص PHP تسلسلات من البايتات، ويستخدم UTF-8 عددًا مختلفًا من البايتات لكل محرف: 1 لحروف ASCII وأرقامها، و2 لحروف مثل é أو ж، و3 للكانا والكانجي الشائع والمحارف الصينية ورموز مثل €، و4 لمعظم الرموز التعبيرية والكانجي النادر مثل 𠮷. تجمع strlen() البايتات؛ وتعدّ mb_strlen() المحارف.

استخدم strlen() عندما تهم البايتات: عمود قاعدة بيانات محدود بالبايتات، أو حجم ملف، أو بروتوكول ثنائي. واستخدم mb_strlen() لكل ما يقرؤه إنسان: عدّاد محارف، أو قاعدة «20 محرفًا كحد أقصى»، أو قطع النص بـ mb_substr().

الرموز التعبيرية والمحارف المكوّنة من عدة نقاط ترميز

تعدّ mb_strlen() نقاط ترميز Unicode. وبعض ما يراه القارئ محرفًا واحدًا هو عدة نقاط ترميز مضمومة معًا: رمز عائلة، أو علم، أو لون بشرة، أو حرف مع علامة مركّبة.

عدّ ما يراه القارئ محارف مفردة (عناقيد الحروف) يحتاج إلى grapheme_strlen() من امتداد intl:

echo grapheme_strlen('👨‍👩‍👧');   // 1
echo grapheme_strlen('🇯🇵');     // 1

لعدّاد محارف في نموذج ياباني، تكفي mb_strlen() عادة: كل محرف كانا وكانجي نقطة ترميز واحدة.

عرض العرض بـ mb_strwidth

في الطرفية أو في تخطيط ثابت العرض، يأخذ المحرف الياباني كامل العرض عمودين بينما يأخذ حرف الكاتاكانا نصف العرض أو الحرف اللاتيني عمودًا واحدًا. تعيد mb_strwidth() ذلك العرض، وهو ما تعنيه عادة القواعد اليابانية «全角は2文字».

التحقق من أن النص فارغ

أوضح اختبار هو المقارنة الصارمة بـ ''. وتعطي strlen($s) === 0 الإجابة نفسها. أما empty($s) فليست مثلها: تعيد أيضًا true للنص "0"، وهو إجابة صحيحة في نماذج كثيرة.

النص المكوّن من مسافات ليس فارغًا. مرّره عبر trim() أولًا إذا كان يجب ألا تُحسب المسافات وحدها شيئًا.

strlen(null) والقيم غير النصية

تتوقع strlen() نصًا. تمرير null ما زال يعيد 0، لكن منذ PHP 8.1 يطبع إشعار إهمال:

Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/index.php on line 2

والمصفوفة ترمي TypeError: strlen(): Argument #1 ($string) must be of type string, array given.

حوّل القيمة أو أعطها قيمة افتراضية أولًا، مثل strlen($value ?? ''). وتُحوَّل الأعداد الصحيحة إلى نصوص، لذا تساوي strlen(12345) القيمة 5. ولعدّ عناصر مصفوفة، استخدم count().

التحقق من طول مُدخلات المستخدم

قاعدة نموذجية: اسم مستخدم من 3 إلى 16 محرفًا، بعد التشذيب. استخدم mb_strlen() حتى يُقاس الاسم الياباني بالمحارف لا بالبايتات.

مع strlen() مكان mb_strlen()، سيُعدّ やまだたろう بـ 18 ويُرفض لأنه طويل جدًا، مع أنه ستة محارف.

الأسئلة الشائعة

كيف أحصل على طول نص في PHP؟

تعيد strlen($s) عدد البايتات وتعيد mb_strlen($s) عدد المحارف. في النص الإنجليزي العادي يتساويان؛ أما في اليابانية أو الحروف ذات العلامات أو الرموز التعبيرية فاستخدم mb_strlen().

لماذا تعيد strlen() طولًا خاطئًا للنص الياباني؟

ليس خاطئًا، إنها تعدّ البايتات. يخزّن UTF-8 كل محرف من الكانا والكانجي الشائع في 3 بايتات، لذا تساوي strlen('日本語') القيمة 9 بينما تساوي mb_strlen('日本語') القيمة 3.

كيف أعدّ محارف نص فيه رموز تعبيرية؟

تعدّ mb_strlen() نقاط ترميز Unicode، لذا يُعدّ الرمز التعبيري البسيط 1، لكن الرمز المبني من عدة نقاط ترميز (عائلة، علم، لون بشرة) يُعدّ أكثر. وتعدّ grapheme_strlen() من امتداد intl ما يراه القارئ محرفًا واحدًا.

ما الفرق بين strlen وcount في PHP؟

تقيس strlen() نصًا، وتعدّ count() عناصر مصفوفة. تمرير مصفوفة إلى strlen() يرمي TypeError في PHP 8.

كيف أتحقق من أن نصًا فارغ في PHP؟

قارنه بنص فارغ: $s === ''، أو strlen($s) === 0. تجنّب empty($s) لهذا الغرض، لأنها تعامل النص "0" أيضًا على أنه فارغ.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن