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, '...') עושה את אותו הדבר לפי רוחב תצוגה, שבו תו יפני ברוחב מלא נחשב 2 עמודות ואות לטינית 1. היא מתאימה לפריסות ברוחב קבוע.
ספירת תת מחרוזת עם 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. היא רגישה לרישיות ולא סופרת התאמות חופפות.