Menu

strpos() ב-PHP: מציאת המיקום של תת מחרוזת

strpos($haystack, $needle) מחזירה את המיקום של המופע הראשון של $needle, או false אם הוא לא נמצא. למדו את בדיקת !== false, stripos שלא תלויה ברישיות, ההתאמה האחרונה עם strrpos ומציאת כל המופעים.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

strpos($haystack, $needle) מחזירה את המיקום של $needle הראשונה בתוך $haystack, שנספר מ-0, או false אם היא לא שם. תמיד בדקו את התוצאה עם !== false, כי התאמה בהתחלה מחזירה 0.

אם אתם צריכים רק תשובה של כן או לא ב-PHP 8, str_contains() ברורה יותר. השתמשו ב-strpos() כשהמיקום חשוב.

תחביר

strpos(string $haystack, string $needle, int $offset = 0): int|false

החיפוש רגיש לרישיות. $offset אומר לה מאיפה להתחיל לחפש; היסט שלילי נספר מסוף המחרוזת.

המלכודת של !== false

0 ו-false שווים בהשוואה רופפת (==). לכן התאמה במיקום 0 מטופלת כ"לא נמצא" בכל בדיקה שאינה מחמירה.

אותו כלל חל על stripos(), strrpos() ו-array_search(), שכולן יכולות להחזיר 0 להתאמה אמיתית.

חיפוש בלי תלות ברישיות עם stripos

stripos() מקבלת את אותם ארגומנטים ומתעלמת מרישיות של אותיות ASCII.

מציאת המופע האחרון עם strrpos

strrpos() מחזירה את המיקום של ההתאמה האחרונה. זו הדרך הסטנדרטית לקבל סיומת של קובץ או את המקטע האחרון של נתיב.

לשמות קבצים במיוחד, pathinfo($file, PATHINFO_EXTENSION) עושה את זה בשבילכם. חיתוך המחרוזת במיקום מוסבר בעמוד substr().

התחלת החיפוש בהיסט

הארגומנט השלישי מדלג על תחילת המחרוזת. היסט שלילי מתחיל כמה תווים כאלה לפני הסוף.

מציאת כל המופעים

strpos() מוצאת התאמה אחת. עברו בלולאה והזיזו את ההיסט אל מעבר לכל התאמה כדי למצוא את כולן:

רק הספירה? substr_count($text, 'the') קצרה יותר. לתבניות, preg_match_all() עם PREG_OFFSET_CAPTURE מחזירה כל התאמה עם המיקום שלה.

טקסט ביפנית: מיקום בבתים מול מיקום בתווים

strpos() מוצאת טקסט מרובה בתים נכון, אבל המספר שהיא מחזירה הוא בבתים. קאנה וקאנג'י נפוצים תופסים 3 בתים כל אחד ב-UTF-8, ולכן בטקסט יפני מלא המיקום בבתים הוא פי שלושה מהמיקום בתווים, ובטקסט מעורב השניים מתרחקים זה מזה בדרכים פחות ברורות. mb_strpos() מחזירה תווים, וזה מה ש-mb_substr() מצפה לו.

ערבוב של השתיים הוא באג קלאסי: העברה של תוצאת strpos() ל-mb_substr() מתחילה רחוק מדי בתוך המחרוזת. השתמשו ב-strpos עם substr, וב-mb_strpos עם mb_substr.

שאלות נפוצות

מה strpos() מחזירה ב-PHP?

את המיקום של ההתאמה הראשונה כמספר שלם, שנספר מ-0, או false אם המחט לא נמצאה. strpos('hello', 'l') מחזירה 2.

למה צריך !== false עם strpos()?

כי התאמה ממש בהתחלה מחזירה 0, ו-0 == false מתקיים. if (strpos($s, 'a')) מתייחס להתאמה במיקום 0 כאל "לא נמצא". תמיד השוו עם strpos($s, 'a') !== false.

מה ההבדל בין strpos, stripos ו-strrpos?

strpos() מוצאת את ההתאמה הראשונה ורגישה לרישיות. stripos() מוצאת את ההתאמה הראשונה בלי תלות ברישיות. strrpos() מוצאת את ההתאמה האחרונה. strripos() מוצאת את ההתאמה האחרונה בלי תלות ברישיות.

להשתמש ב-strpos או ב-str_contains כדי לבדוק אם מחרוזת מכילה טקסט?

ב-PHP 8 השתמשו ב-str_contains($haystack, $needle), שמחזירה true או false פשוטים ואין בה את המלכודת של מיקום 0. השתמשו ב-strpos() כשאתם צריכים את המיקום עצמו.

איך משתמשים ב-strpos עם טקסט ביפנית?

strpos() מוצאת טקסט יפני נכון אבל מחזירה מיקום בבתים. אם אתם מעבירים את המיקום ל-mb_substr() או מציגים אותו למשתמש, השתמשו ב-mb_strpos(), שמחזירה את המיקום בתווים.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל