regular expressions

Crash Course על regular expressions שיסביר לכם תוך כמה דקות על regular expressions ואיך משתמשים בו.

regular expressions, כפי שכולם יודעים, מאפשרים לנו לייצר תבניות מסוימות של טקסט. יש מישהו שלא מכיר regular expressions? מדובר בתיאור של תבנית מסוימת בטקסט שמאפשרת לנו לבצע מניפולציה מסוימת בטקסט. בין אם לבדוק האם התבנית מתקיימת (לצרכי ולידציה או סניטציה) ובין אם ביצוע Search & Replace. לא מעט מתכנתי אינטרנט מתייחסים ל-regular expressions בתור סוג של וודו, במדריך הזה אני מתכוון לשבור את הבורות וללמד אתכם להשתמש ב-regular expressions תוך מספר דקות.

כמה הערות קטנות:
1. אני מלמד regular expressions שמבוססים על PERL.
2. על מנת לבדוק את ה-regular expressions, אני משתמש בפונקצית preg_match ב-PHP. אם אתם רוצים (וכדאי מאד!!!) לתרגל את מה שאני מראה כאן, או שתשתמשו ב-PHP כמוני בדוגמאות או שתשתמשו באקווילנט של regex_match בשפה שלכם.

בכל שפה יש פקודה שבודקת אם תבנית מסוימת מתקיימת בטקסט מסוים. אם התבנית מתקיימת, אז אנו מקבלים true. במידה ולא, אנו מקבלים false. ב-PHP הפקודה היא preg_match שמקבלת שני ארגומנטים. הראשון הוא ה-regex pattern והשני הוא מחרוזת טקסט כלשהי. במידה והתבנית מאומתת במלואה, אז אנו מקבלים true.

בואו ונתחיל! יש לי את המחרוזת המופלאה 'abc' בואו ונבדוק אם יש בה את האות a.


$my_text = 'abc';

$result = preg_match('/a/', $my_text);

print "Result: $result";

אם נריץ את זה נראה שהתוצאה היא 1, כלומר מצאנו את a. אגב, הסלאשים הם חיוניים והם נקראים דילמיטרים.

נניח שאני רוצה לחפש בטקסט שלי את המילה: 'bc' ולא את המילה a, איך אני עושה את זה? פשוט ביותר! ממש כך:



$my_text = 'abc';

$result = preg_match('/bc/', $my_text);

print "Result: $result";

טוב, זה ממש פשוט. יותר מדי פשוט, בואו נסבך את העניינים קצת. נניח שאני רוצה למצוא את צירוף המילים ab, אבל רק כאשר הוא בתחילת משפט! כלומר, abc זה בסדר אבל zabc זה לא (כי ab לא בתחילת המשפט). איך עושים את זה? בדיוק בשביל זה יש לנו ביטויים רגלוטוריים. הביטוי הראשון הוא ^ – שאם הוא נמצא בתחילת הביטוי אז מדובר בתחילת שורה:



$my_text = 'abc';

$result = preg_match('/^ab/', $my_text);

print "Result: $result";

זה יחזיר לי תוצאה, כיוון שהביטוי מתיחס לכל טקסט שמתחיל ב-ab. לפיכך זה יתפוס על טקסט abc, abcd וגם ababulele לצורך העניין. הביטוי כולל כל מחרוזת טקסט שמתחילה ב-ab.
כמו שיש לנו ביטוי שמציין התחלה, יש לנו ביטוי שמציין סוף שורה. הביטוי הזה למשל:
bc$ יציין כל טקסט שהוא שנגמר ב-bc. למשל abc או bababababc



$my_text = 'ababababababc';

$result = preg_match('/bc$/', $my_text);

print "Result: $result";

אם אנו רוצים לשלב בין שני הביטויים? למשל ביטוי שמתחיל ב-a או נגמר ב-bc? מאד פשוט! משתמשים ב-|



$my_text = 'adfdfdfdbc';

$result = preg_match('/^a|bc$/', $my_text);

print "Result: $result";

הביטוי הרגולרי ^a|bc$ (או מתחיל ב-a או נגמר ב-bc) יתפוס לגבי abc, abcfsfbc או כל ביטוי אחר.
ואם אנו רוצים ביטוי שגם מתחיל ב-a וגם נגמר ב-bc? כלומר – ביטוי שיתפוס גם את abc, גם את agfgfgfgbc ובעצם כל דבר שמתחיל ב-a ונגמר ב-bc? כלומר, בין a לבין bc יהיו אפס או יותר תוים (כמה בדיוק? לא אכפת לנו). כך עושים את זה:



$my_text = 'adad  bc';

$result = preg_match('/^a.*bc$/', $my_text);

print "Result: $result";

לא להכנס לפאניקה! מה יש לנו פה? יש לנו סימן של תחילת שורה ^ ואז a שמראה לנו שחייב שיהיה a בהתחלה. בסוף יש לנו סימן של סוף ביטוי שמראה לנו ש-bc צריכים להיות בסוף. מה שחדש ומוזר הוא .* שני סימנים חדשים. נקודה זה כל תו שהוא – מספר, סימן מיוחד, אות בעברית, אנגלית ובעצם הכל. כוכבית היא סימן מיוחד שאומרת אפס או יותר. כלומר אני מגדיר בביטוי הזה שחייב להיות a בתחילתו, חייב להיות bc בסופו ובאמצע יכול להיות כל תו בכמות של אפס או יותר.
ואם הייתי רוצה 1 או יותר? אז זה פשוט, במקום כוכבית אפשר להשתמש בסימן +



$my_text = 'addbc';

$result = preg_match('/^a.+bc$/', $my_text);

print "Result: $result";

בביטוי כזה addbc יתפוס, גם ביטוי כמו assnfjskfjdskbc יתפוס. מה לא יתפוס? נכון abc כי בין a ל-bc צריך להיות אחד או יותר תווים.
ואם הייתי רוצה שבין a ל-b יהיה או אפס או תו אחד בלבד? גם זה פשוט, במקום + נשתמש בסימן שאלה



$my_text = 'adbc';

$result = preg_match('/^a.?bc$/', $my_text);

print "Result: $result";


בדוגמא הזו abc יתפוס, adbc יתפוס וכל ביטוי אחר שיש תו אחד בלבד בין a ל-bc. ביטוי כמו addbc שיש בו שני תוים בין a ל-bc לא יתפוס.
אם אני רוצה כמות ספציפית של תוים, אני יכול לכתוב אותן עם סוגריים מסולסלות שמפרטות את המקסימות והמינימום:



$my_text = 'aghgddbc';

$result = preg_match('/^a.{2,5}bc$/', $my_text);

print "Result: $result";

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



$my_text = 'a@@bc';

$result = preg_match('/^a@{2,5}bc$/', $my_text);

print "Result: $result";

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



$my_text = 'aaa@@bc';

$result = preg_match('/^a[@a]{2,5}bc$/', $my_text);

print "Result: $result";

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



$my_text = 'aggbc';

$result = preg_match('/^a[a-z]{2,5}bc$/', $my_text);

print "Result: $result";

בדוגמא הזו הביטוי affbc יתפוס, אבל ביטוי כמו aff1bc לא יתפוס כי 1 הוא לא בטווח המספרים:
אני יכול גם להוסיף טווחים נוספים, כמו 0-9 ו-A-Z לאותיות גדולות:



$my_text = 'agg11Abc';

$result = preg_match('/^a[a-zA-Z0-9]{2,5}bc$/', $my_text);

print "Result: $result";

הסימן ^ משמש גם לשלילה אם הוא מופיע בתוך הסוגריים המרובעות, כך למשל



$my_text = 'aggAbc';

$result = preg_match('/^a[^b]*bc$/', $my_text);

print "Result: $result";

בגלל ש-^b נמצא בתוך הסוגריים המרובעות, המשמעות שלו היא כל תו חוץ מ-b.
סוגריים עגולים מאפשרים לנו ליצור תת תבנית, זה שימושי במקרים מסוימים – כמו למשל בבדיקת מייל:



$my_text = '[email protected]';

$result = preg_match('/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-z]+(\.[a-z]+)?$/', $my_text);

print "Result: $result";

עד כאן בנוגע ל-regular expressions בסיסי. יש עוד המון מה ללמוד ב-regular expressions, אבל זהו הבסיס שיאפשר לכם להתקדם הלאה. אני מאד ממליץ לתרגל את כל הדוגמאות על מנת שתבינו היטב את הוודו הזה וגם תוכלו לשלוט בו.

פוסטים נוספים שכדאי לקרוא

תמונה של עציץ, רספברי פיי ורמקול
רספברי פיי

לגרום לעציץ שלכם לדבר

כך תשתמשו ברספברי פיי, חיישנים וגם בינה מלאכותית שמותקנת על הרספברי פיי (כן) כדי ליצור… עציץ המדבר.

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

גלילה לראש העמוד