str_contains($haystack, $needle) מחזירה true אם $needle מופיעה איפשהו ב-$haystack, ו-false אחרת. היא נוספה ב-PHP 8.0 והיא רגישה לרישיות.
בניגוד ל-strpos(), היא מחזירה בוליאני אמיתי, ולכן אין את המלכודת של "נמצא במיקום 0 נראה כמו false".
תחביר
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
שלושתן נוספו ב-PHP 8.0 ועובדות בית אחר בית, ולכן הן מטפלות נכון ביפנית ובטקסט UTF-8 אחר בלי גרסת mb_.
בדיקת ההתחלה או הסוף עם str_starts_with ו-str_ends_with
בדיקת הכלה בלי תלות ברישיות
אין str_icontains(). המירו קודם את שתי המחרוזות לאותיות קטנות. mb_strtolower() ממירה לאותיות קטנות גם אותיות מחוץ ל-ASCII, כמו É או אותיות קיריליות, ש-strtolower() משאירה כמו שהן.
מחט ריקה מחזירה true
מחט ריקה נמצאת בכל מחרוזת, כולל במחרוזת ריקה. זה חשוב כשהמחט מגיעה מתיבת חיפוש שהמשתמש השאיר ריקה.
בדיקה אם מחרוזת מכילה אחת מכמה מילים או את כולן
str_contains() מקבלת מחט אחת. עברו בלולאה על מערך של מחטים: החזירו ברגע שאחת מתאימה בשביל "אחת מהן", או ברגע שאחת נכשלת בשביל "כולן".
כדי לבדוק אם ערך הוא אחד האיברים של מערך, ולא תת מחרוזת של מחרוזת, השתמשו ב-in_array().
לפני PHP 8: strpos !== false
קוד שצריך לרוץ על PHP 7 משתמש ב-strpos() עם השוואה מחמירה. היא נותנת את אותה תשובה כמו str_contains(), חוץ ממחט ריקה: strpos() של PHP 7 הדפיסה Warning: strpos(): Empty needle והחזירה false.
השורה האחרונה מדפיסה bool(false) למרות שהטקסט שם, כי php יושב במיקום 0. החלפת בדיקות כאלה ב-str_contains() היא אחד השדרוגים הקלים ביותר ל-PHP 8.
שאלות נפוצות
איך בודקים אם מחרוזת מכילה מילה ב-PHP?
ב-PHP 8 השתמשו ב-str_contains($haystack, $needle), שמחזירה true או false: str_contains('Hello world', 'world') הוא true. ב-PHP 7 השתמשו ב-strpos($haystack, $needle) !== false.
האם str_contains רגישה לאותיות גדולות וקטנות?
כן. לבדיקה בלי תלות ברישיות, המירו את שני הצדדים לאותיות קטנות: str_contains(mb_strtolower($haystack), mb_strtolower($needle)), או השתמשו ב-stripos($haystack, $needle) !== false.
למה str_contains מחזירה true למחרוזת ריקה?
כל מחרוזת מכילה את המחרוזת הריקה, ולכן str_contains('abc', '') מחזירה true. אם המחט מגיעה מקלט של משתמש, בדקו קודם שהיא לא ריקה.
איך בודקים אם מחרוזת מתחילה או מסתיימת במשהו ב-PHP?
השתמשו ב-str_starts_with($s, 'http') וב-str_ends_with($s, '.pdf'), ששתיהן נוספו ב-PHP 8.0. כמו str_contains(), הן רגישות לרישיות ומחזירות bool.