trim($string) מחזירה את המחרוזת בלי רווחים לבנים בהתחלה ובסוף: רווחים, טאבים, ירידות שורה, החזרות גררה, בתי NUL וטאבים אנכיים. ltrim() מסירה אותם רק מההתחלה ו-rtrim() רק מהסוף. רווחים באמצע נשמרים.
הפלט של var_dump() מראה את האורך של כל תוצאה, וזה הופך את התווים שהוסרו לגלויים. trim הוא הדבר הראשון שעושים לרוב הערכים מטופס (סיסמאות הן היוצא מן הכלל, ראו בסוף העמוד): משתמש שמקליד 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() עובדת בית אחר בית, הרווח הוא 3 הבתים 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 ומטה הביטוי הרגולרי הוא הדרך.
trim לכל ערך במערך
array_map('trim', $array) עושה trim לכל ערך ושומרת על המפתחות. מקרה טיפוסי הוא רשימה מופרדת בפסיקים משדה טקסט, שפוצלה עם explode():
trim לערך מטופס לפני אימות
עשו trim קודם, ואז בדקו מחרוזת ריקה. שדה שמכיל רק רווחים נדחה אז כריק. הריצו את הבלוק, הקלידו בטופס שם עם רווחים סביבו ולחצו על Send: אותו סקריפט ירוץ שוב כש-$_POST מלא.
אל תעשו trim לסיסמאות: רווח בסוף סיסמה הוא חלק ממנה.
שאלות נפוצות
מה 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, ', ').
איך עושים trim לכל ערך במערך?
array_map('trim', $array) מחזירה מערך חדש שבו כל ערך עבר trim, עם אותם מפתחות. למערכים מקוננים, השתמשו ב-array_walk_recursive() עם הפניה.