تعيد trim($string) النص بعد حذف المسافات البيضاء من بدايته ونهايته: المسافات، وعلامات الجدولة، والأسطر الجديدة، وعلامات رجوع العربة، وبايتات NUL، وعلامات الجدولة العمودية. وتحذفها ltrim() من البداية فقط وrtrim() من النهاية فقط. وتبقى المسافات في الوسط.
تُظهر مخرجات var_dump() طول كل نتيجة، وهذا يجعل المحارف المحذوفة مرئية. التشذيب أول ما يُفعل مع معظم القيم القادمة من نموذج (كلمات المرور استثناء، انظر آخر الصفحة): المستخدم الذي يكتب ada@example.com مع مسافة ختامية يجب أن يتمكن من تسجيل الدخول مع ذلك.
الصيغة
trim(string $string, string $characters = " \n\r\t\v\0"): string
ltrim(string $string, string $characters = " \n\r\t\v\0"): string
rtrim(string $string, string $characters = " \n\r\t\v\0"): string
تعيد trim() نصًا جديدًا؛ ولا تغيّر المتغير الذي تمرره.
تشذيب محارف محددة
يستبدل الوسيط الثاني القائمة الافتراضية. ويُحذف كل محرف فيه من الطرفين، بأي ترتيب وأي عدد من المرات. وتحدد .. نطاقًا، لذا فإن 'a..z' تعني كل حرف صغير.
لمواصلة حذف المسافات البيضاء العادية أيضًا، ضمّنها في القائمة: trim($s, " \n\r\t\v\0/").
الوسيط الثاني مجموعة محارف لا نص
لا تحذف trim() كلمة أو لاحقة. بل تحذف أيًّا من المحارف التي تذكرها، من الطرفين، حتى تصل إلى محرف ليس في القائمة. وهذا يفاجئ من يحاولون حذف امتداد ملف:
يحذف السطر الأول الحرف h في البداية أيضًا، لأن h في المجموعة. لحذف بادئة أو لاحقة ثابتة، استخدم str_starts_with() أو str_ends_with() مع substr()، أو str_replace() إذا كان النص لا يمكن أن يظهر في مكان آخر.
تشذيب المسافة كاملة العرض (المُدخلات اليابانية)
كثيرًا ما تنتج لوحات المفاتيح اليابانية المسافة الإيديوغرافية (U+3000)، مثلًا حول اسم كُتب في نموذج. ليست في القائمة الافتراضية لـ trim، وذكرها في الوسيط الثاني فخ: تعمل trim() بايتًا بايتًا، والمسافة هي البايتات الثلاثة E3 80 80، وE3 هو أيضًا البايت الأول لكل محرف هيراغانا وكاتاكانا، لذا يخسر الاسم الذي يبدأ بأحدها البايت الأول من ذلك المحرف. استخدم تعبيرًا نمطيًا مع المعدّل u:
يثبّت \A و\z المطابقة عند بداية النص ونهايته. ومع المعدّل u، يطابق \s كل مسافة Unicode: المسافات البيضاء في ASCII، والمسافة كاملة العرض، والمسافة غير القابلة للكسر (U+00A0) التي كثيرًا ما يجلبها النسخ واللصق من صفحات الويب. ودون u، لا يطابق \s إلا مسافات ASCII البيضاء وتبقى المسافة كاملة العرض. تضيف PHP 8.4 الدوال mb_trim() وmb_ltrim() وmb_rtrim() لهذا الغرض؛ وفي PHP 8.3 وما قبلها يكون التعبير النمطي هو الطريق.
تشذيب كل قيمة في مصفوفة
تشذّب array_map('trim', $array) كل قيمة وتحتفظ بالمفاتيح. والحالة النموذجية قائمة مفصولة بفواصل من حقل نصي، مقسّمة بـ explode():
تشذيب قيمة النموذج قبل التحقق منها
شذّب أولًا، ثم تحقق من النص الفارغ. عندها يُرفض الحقل الذي لا يحتوي إلا مسافات على أنه فارغ. شغّل هذه الكتلة، واكتب اسمًا حوله مسافات في النموذج واضغط Send: يعمل السكربت نفسه مرة أخرى مع امتلاء $_POST.
لا تشذّب كلمات المرور: المسافة في نهاية كلمة المرور جزء منها.
الأسئلة الشائعة
ماذا تحذف trim() في PHP؟
افتراضيًا، من طرفي النص: المسافات، وعلامات الجدولة (\t)، والأسطر الجديدة (\n)، وعلامات رجوع العربة (\r)، وبايتات NUL (\0)، وعلامات الجدولة العمودية (\v). ولا تلمس وسط النص أبدًا.
ما الفرق بين trim وltrim وrtrim؟
تنظّف trim() الطرفين، وltrim() البداية فقط، وrtrim() النهاية فقط. والثلاث تأخذ القائمة الاختيارية نفسها من المحارف المراد حذفها.
لماذا لا تحذف trim() المسافة اليابانية كاملة العرض؟
المسافة كاملة العرض (U+3000) ليست في القائمة الافتراضية لـ trim وطولها 3 بايتات في UTF-8. استخدم preg_replace('/\A\s+|\s+\z/u', '', $s): مع المعدّل u، يطابق \s كل مسافة Unicode، بما فيها U+3000. وتضيف PHP 8.4 الدالة mb_trim()، التي تحذفها أيضًا.
كيف أحذف آخر فاصلة من نص في PHP؟
تحذف rtrim($s, ',') كل فاصلة ختامية. وإذا كانت قد تليها مسافة، فضمّن المسافة أيضًا: rtrim($s, ', ').
كيف أشذّب كل قيمة في مصفوفة؟
تعيد array_map('trim', $array) مصفوفة جديدة مشذّبة القيم، مع الاحتفاظ بالمفاتيح. وللمصفوفات المتداخلة، استخدم array_walk_recursive() مع مرجع.