אתה נמצא כאן יסודות השפה  >>  ביטויים רגולריים - PCRE  >>  מודיפיקטורים

מודיפיקטורים

מודיפיקטורים (modifiers) משנים חוקים כלליים של ביטויים רגולריים (PCRE). כאשר כותבים ביטוי רגולרי, תוחמים אותה בין 2 סימני / ואת המודיפיקטורים ניתן לציין בסוף הביטוי. למשל: בביטוי /Case-InSensitive/i ה-i הוא מודיפיקטור שמציין למעשה case-insensitive. לכל מודיפיקטור יש קבוע שמוגדר ב-PHP ואות (case-sensitive) שמציינים אותה בביטוי. ניתן לכתוב כמה מודיפיקטורים ביחד.

רשימת המודיפיקטורים מובאת בטבלה הבאה:

קבוע אות הסבר
PCRE_CASELESS i מודיפיקטור זה גורם לכך שאותיות בביטוי יתאימו גם לאותיות גדולות וגם לאותיות קטנות, ולא משנה אם בביטוי מופיע האות הגדולה או הקטנה.
PCRE_MULTILINE m כברירת מחדל, הסימנים המיוחדים ^ ו-$ מתייחסים להתחלת וסוף המחרוזת. אם מודיפיקטור זה מצויין, אז סימנים אלו מתייחסים להתחלת וסוף כל שורה חדשה במחרוזת (מופרדים עם \n).
PCRE_DOTALL s כברירת מחדל, הסימן המיוחד . (נקודה) מתאים לכל תו בודד, פרט לשורה חדשה (\n). אם מודיפיקטור זה מצויין, אז הסימן המיוחד . מתאים לכל תו בודד, כולל תו של שורה חדשה (\n).
PCRE_EXTENDED x מודיפיקטור זה מתעלם מתווים לבנים (רווחים) שהם לא "מוברחים" (עם הסימן \). לא מתעלם מתווים לבנים שנמצאים בתוך מחלקת תווים, גם אם לא "מוברחים".
כברירת מחדל, לא ניתן לכתוב הערות בתוך ביטוי רגולרי. מודיפיקטור זה מאפשר גם כתיבת הערות בתוך ביטויים מסובכים בעזרת הסימן המיוחד # (לא ניתן לכתוב הערות בתוך מחלקת תווים).
e מודיפיקטור זה בשימוש רק ב-PHP, בפונקציה preg_replace().
כאשר מודיפיקטור זה מצויין, אז את המחרוזת המחליפה מחשבים כקוד PHP, והפלט המוחזר מתחלף עם הביטוי. (ראה גם את הפונקציה eval()).
PCRE_ANCHORED A מודיפיקטור זה מכריח את הביטוי להיות "מעוגן", כלומר החיפוש של הביטוי יחל רק מההתחלה של המחרוזת שבה אנו מחפשים התאמה. (ניתן ליצור ביטוי עם סימנים מיוחדים שיעשה בדיוק את אותו הדבר ללא מודיפיקטור זה).
PCRE_DOLLAR_ENDONLY D מודיפיקטור זה גורם לסימן המיוחד $ להתאים רק לסוף האבסולוטי של המחרוזת (ולא גם לסופי שורות).
אם המודיפיקטור m מצויין יחד איתו, אז מודיפיקטור זה לא משפיע.
S מודיפיקטור זה "לומד" את הביטוי. כאשר מודיפיקטור זה מצויין, אז PHP מנסה "ללמוד" את הביטוי, כלומר PHP מבצעת אנליזה על הביטוי כדי להגביר את מהירות החיפוש של ההתאמות. מודיפיקטור זה טוב עבור ביטויים שיש בהם שימוש חוזר הרבה פעמים, אך לא כל-כך יעיל עבור ביטויים שהם "מעוגנים" (בתחילת המחרוזת) או עבור ביטויים שמתחילים עם אות קבועה.
PCRE_UNGREEDY U בדר"כ הכמתים של PCRE הם "חמדנים", ולפעמים החמדנות הזו גורמת להתאמות לא רצויות. מודיפיקטור זה מונע מהכמתים להיות "חמדנים".
למשל: ביטוי לחיפוש הערות ב-C /\/\*.*\*\// עבור המחרוזת "/*comment_1*/ no_comment /*comment_2*/" תמצא התאמה שהיא המחרוזת כולה (הכמת * הוא "חמדן"). אך אם נשתמש במודיפיקטור שמונע "חמדנות" באותו הביטוי /\/\*.*\*\//U, נקבל 2 התאמות עבור 2 ההערות.
PCRE_EXTRA X מודיפיקטור זה מונע שימוש לא נכון ב-"הברחת" אותיות. אם כותבים צירוף עם תו ההברחה \ ואות, ואין לצירוף משמעות מיוחדת, אז הביטוי יוציא שגיאה. בדר"כ, כאשר לא משתמשים במודיפיקטור זה, צירוף ללא משמעות נחשב לאות עצמה. (מודיפיקטור זה לא משפיע על צירופים עם תווים מיוחדים שאין להם משמעות).
PCRE_UTF8 u מודיפיקטור זה מתייחס למחרוזות כאילו הן בקידוד של UTF-8. זמין רק עבור PHP4.1.0 או יותר ב-Unix, ועבור PHP4.2.3 או יותר ב-Windows.

את המודיפיקטורים PCRE_CASELESS(i), PCRE_MULTILINE(m), PCRE_DOTALL(s), PCRE_EXTENDED(x), PCRE_UNGREEDY(U) ו-PCRE_EXTRA(X) ניתן לשנות גם בתוך הביטוי עצמו, ולא רק בסוף הביטוי. כדי לשנות מודיפיקטור בתוך הביטוי, כותבים למשל (?im) כדי להפעיל את המודיפיקטורים i ו-m. כדי לכבות מודיפיקטורים משתמשים בסימן מינוס (-), למשל: (?im-sx) מפעיל את המודיפיקטורים i ו-m, ומכבה את המודיפיקטורים s ו-x. כאשר משנים את המודיפיקטורים ברמה הכי עליונה של הביטוי, אז השינוי משפיע על כל הביטוי, כאילו המודיפיקטור נכתב בסוף הביטוי (למשל: הביטויים /(?i)abc/, /ab(?i)c/ ו-/abc/i בעלי אותה משמעות). כאשר המודיפיקטור נמצא בתוך תת-תבנית, אז המודיפיקטור משפיע מהמיקום שלו והלאה (למשל: הביטוי /(a(?i)b|c)/ מתאים עבור המחרוזות: "ab", "aB", "c", "C").

תת-תבנית שלא נתפסת מתחילה ב-(?: וניתן לשנות מודיפיקטורים בתת-תבניות שלא נתפסות בצורה פשוטה יותר. למשל, תת-התבנית (?i:januar|december) שקול לתת-התבנית (?:(?i)januar|december).


תגובות בנושא

תת-תבניות שלא נתפסות 08-12-03 12:01
 דניאל כהן
#1060

שתי השורות האחרונות לא ממש מובנות. מה בדיוק :?) אמור לעשות ?

תפיסת תת-תבנית 08-12-03 14:02
 אלי חן (מנהל)
#1066

תת-תבנית בביטויים רגולריים כותבים בתוך סוגריים () וכן תת-התבנית "נתפסת". זאת אומרת שניתן להשתמש במה שנתפס בתת-התבנית בייחוס חוזר. תת-תבנית שמתחילה ב :?) אינה נתפסת, ולא ניתן לעשות לה ייחוס חוזר.
(ראה תת-תבניות וייחוס חוזר בדף הקודם - תחביר).


לדף הקודםתחביר -הקודם
לתחילת הדףלתחילת הדף
הבא- שימושים בביטויים רגולרייםלדף הבא