Menu

preg_replace() ב-PHP: החלפה עם regex והפניות לאחור

preg_replace($pattern, $replacement, $subject) מחליפה כל התאמה של ביטוי רגולרי: preg_replace('/\s+/', ' ', $text) מכווצת רווחים לבנים. למדו הפניות לאחור כמו $1, את preg_replace_callback, הסרת תווים שאינם אותיות או ספרות, הגבלות וספירות.

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

preg_replace($pattern, $replacement, $subject) מוצאת כל התאמה של ביטוי רגולרי במחרוזת ומחליפה אותה. preg_replace('/\s+/', ' ', $text) הופכת כל רצף של רווחים, טאבים וירידות שורה לרווח אחד.

המחרוזת המקורית לא משתנה; preg_replace() מחזירה מחרוזת חדשה. \b מסמן גבול מילה, ולכן cats נשאר כמו שהוא.

הפניות לאחור: 1,1, {1} ו-\1

במחרוזת ההחלפה, $1 מייצג את מה שקבוצת הלכידה הראשונה התאימה, $2 את השנייה, ו-$0 את ההתאמה כולה. השתמשו בהם כדי לסדר מחדש את הטקסט שהתאים.

כתבו את ההחלפה בגרשיים בודדים. במירכאות כפולות "\1" הופך לרצף escape אוקטלי (הבית 0x01) ו-"${1}" נקרא כמשתנה בשם 1, שאינו מוגדר ומשתמש בתחביר מחרוזת שהוצא משימוש מאז PHP 8.2. '\1' בגרשיים בודדים עובד כמו '$1', אבל $1 הוא הכתיב הנפוץ.

הסרת תווים שאינם אותיות או ספרות

מחלקת תווים שלילית, [^...], מתאימה לכל מה שלא רשום. החלפה שלה ב-'' מסירה אותו. לטקסט בשפות אחרות, השתמשו במחלקות ה-Unicode \p{L} (כל אות) ו-\p{N} (כל ספרה) עם המשנה u, אחרת תסירו את é, את ü ואת כל תו יפני.

יצירת slug לכתובת URL

כמה תבניות ברצף הופכות כותרת ל-slug לכתובת URL. המירו קודם לאותיות קטנות, החליפו כל רצף של תווים שאינם אותיות או ספרות במקף אחד, ואז קצצו מקפים מהקצוות:

כמה תבניות, הגבלה וספירה

$pattern ו-$replacement יכולים להיות מערכים: כל תבנית מוחלפת בהחלפה שבאותו אינדקס, לפי הסדר. הארגומנט הרביעי מגביל את ההחלפות לכל תבנית (-1 פירושו בלי הגבלה), והחמישי מקבל כמה החלפות בוצעו.

חישוב ההחלפה עם preg_replace_callback

כשההחלפה תלויה בהתאמה, השתמשו ב-preg_replace_callback(). היא קוראת לפונקציה שלכם פעם אחת לכל התאמה עם המערך $matches ומכניסה את מה שהפונקציה מחזירה. פונקציית חץ שומרת callbacks קצרים בשורה אחת.

preg_replace_callback_array() מקבלת מערך של זוגות pattern => callback כשכל אחת מכמה תבניות צריכה פונקציה משלה.

טקסט החלפה ממשתנה

ל-$ או ללוכסן הפוך במחרוזת ההחלפה יש משמעות, ולכן החלפה שמגיעה ממשתמש או ממסד נתונים עלולה להשתבש. מחיר של $10 נקרא כהפניה לקבוצה 10, שלא קיימת, ויוצא ריק:

כשלא טקסט החיפוש ולא ההחלפה הם תבנית, str_replace() היא הבחירה הפשוטה והמהירה יותר. כדי לבדוק תבנית לפני שמחליפים משהו, ראו preg_match().

שאלות נפוצות

איך משתמשים בהפניות לאחור ב-preg_replace?

התייחסו לקבוצות לכידה כ-$1, $2 (או \1) במחרוזת ההחלפה: preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') מחזירה "14/03/2026". כתבו את ההחלפה בגרשיים בודדים, והשתמשו ב-${1} כשספרה באה אחרי ההפניה.

איך מסירים את כל התווים שאינם אותיות או ספרות ב-PHP?

preg_replace('/[^a-zA-Z0-9]/', '', $s) שומרת רק אותיות וספרות ASCII. כדי לשמור אותיות מכל שפה (é, ü, 日本語), השתמשו במחלקות Unicode עם המשנה u: preg_replace('/[^\p{L}\p{N}]/u', '', $s).

מה ההבדל בין preg_replace ל-preg_replace_callback?

preg_replace() מקבלת מחרוזת החלפה קבועה עם ממלאי מקום $1. preg_replace_callback() קוראת לפונקציה לכל התאמה ומשתמשת בערך ההחזרה שלה, כך שאפשר לחשב את ההחלפה: להמיר לאותיות גדולות, לעשות עליה חשבון או לחפש אותה במערך.

להשתמש ב-str_replace או ב-preg_replace?

השתמשו ב-str_replace() כשמחליפים טקסט קבוע: היא מהירה יותר ולא צריכה escape. השתמשו ב-preg_replace() כשהטקסט להחלפה עוקב אחרי תבנית, כמו כל רצף של רווחים, כל ספרה או גבול מילה.

איך מחליפים רק את ההתאמה הראשונה עם preg_replace?

העבירו הגבלה כארגומנט הרביעי: preg_replace('/\d+/', '#', 'a1 b2 c3', 1) מחזירה "a# b2 c3". הארגומנט החמישי, שמועבר לפי הפניה, מקבל את מספר ההחלפות שבוצעו.

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

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

להתחיל