מאפס לגיבור רגקס
חילוץ וניתוח מחרוזות דמויות‑URL עם ביטוי רגולרי יחיד
תוכן עניינים
- 🚀 מבוא
- 🔍 חילוץ כתובות URL מטקסט
- 🛳️ ה‑Regex של 120+ בתים
- 🧩 פירוק שלב‑אחר‑שלב
- 🛠️ דוגמת ניתוח
- ☑️ צעדים הבאים
- 📝 סיכום
- 📚 למידה נוספת
TL;DR: קפצו ישר לRegex של 120+ בתים.
🚀 מבוא
חילוץ כתובות URL מטקסט גולמי יכול לעיתים להרגיש כמו משחק משעמם של “הכה חור”. פיסוק, עטיפות בסוגריים, ועיצוב דו‑משמעי כולם מתנגשים ומקשים על העבודה. בין אם אתם בונים סקרייפר אינטרנט, מנתח נתונים, או אפליקציית צ’אט, חילוץ מדויק של URL הוא קריטי.
בפוסט הזה נתקוף את הבעיה ישירות עם גישה גמישה של שני שלבים. המטרה שלנו היא לתפוס תחילה את כל המחרוזות שיכולות להיראות כ‑URL ולאחר מכן לבצע אימות בתהליך נפרד.
💡 הערה: תבנית זו איננה מיועדת לאימות כתובות URL! היא מתוכננת להיות מרחיבה בכוונה עם פיסוק ואיות לקוי.
- תפוס כל מה שדומה ל‑URL: שגר רשת רחבה כדי ללכוד את כל המחרוזות שיכולות להיות URL. כאן ה‑“regex של 120+ בתים” שלנו מצטיין.
- אימות: אחרי שתופסים את המועמדים, השתמשו בבדיקות משניות (למשל, פתרון DNS, השוואה לדומיינים מוכרים) כדי להסיר ערכים שגויים.
המחשת האתגר
מונחים כמו extract ו‑parse משמשים לעיתים באופן חלופי, אך הם מתייחסים לתהליכים שונים. חילוץ URL כולל זיהוי ותפיסת כתובות פוטנציאליות מתוך טקסט רחב. פירוק, לעומת זאת, מתמקד בפירוק כתובות אלו לחלקים המרכיבים אותן.
כאשר אני מדבר על פירוק או על “חלקי URL”, אני מתכוון לרכיבים הבאים:
לחצו כדי לראות צילום מסך של התאמת תתי‑מחרוזת ב‑RegEx101.
לפני שנצלול עמוק לתוך ה‑regex, נשתמש בכלי חזותי כדי לראות כמה טוב הדפוס שלנו תופס התאמות רבות:

ה‑Regex של 120+ בתים
להלן regex תמציתי שנועד לחלץ ולפענח URL ב‑צעד אחד. הוא תומך במגוון פרוטוקולים, דומיינים, נתיבים, ובחלקי שאילתה/פרגמנט אופציונליים.
אל תדאגו—נפרק את זה שלב אחרי שלב!
const urlRegex = /([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)/gi;// Compatibility: ES5+// Samepattern, split on newlines for readability:([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)שתפו את ה‑regex הכי פראיים שנתקלים בהם (או שכתבתם) בתגובות להלן! 🚀
🧩 פירוק שלב‑אחר‑שלב
בואו ננתח את ה‑regex רכיב‑רכיב כדי להבין איך הוא פועל:
1. פרוטוקול (קבוצה 1): ([-.a-z0-9]+:/{1,3})
- מטרה: תופס את חלק הפרוטוקול של ה‑URL (למשל
http://,ftp://,custom-scheme://). הסבר:
[-.a-z0-9]+: תופס אותיות קטנות, ספרות, מקפים או נקודות – תווים נפוצים בשם פרוטוקול.:/{1,3}: תופס נקודתיים ולאחריה אחת עד שלוש קוי נטייה (:/,://או:///).
2. דומיין (קבוצה 2): ([^-/.[](|)s?][^`/s]?]+)
- מטרה: קולט את חלק הדומיין או המארח של ה‑URL.
הסבר:
[^-/.[](|)\s?]: תופס כל תו חוץ מהתווים המיוחדים והמרווחים המצוינים.[^`/\s]?]+: תופס אחד או יותר תווים חוץ ממקף אחורי, קו נטייה, רווח או סוגר מרובע סגור.
3. נתיב (קבוצה 3): ([-_a-z0-9!@$%^&*()=+;/~\.]*)
- מטרה: תופס את רכיב הנתיב של ה‑URL.
הסבר:
[-_a-z0-9!@$%^&()=+;/~.]: תופס אפס או יותר תווים בטוחים ל‑URL שנפוצים בנתיבים.
4. מחרוזת שאילתה (קבוצה 4): [?]?([^#\s`?]*)
- מטרה: תופס באופן אופציונלי מחרוזת שאילתה, המתחילה בכל תו
?. הסבר:
[?]?: תופס באופן אופציונלי?. (הסוגריים המרובעים אינם הכרחיים, אך הם ברורים מעט יותר מהכתיבה הקיצרתית??. הם גם מספקים מקביל חזותי לקבוצה הבאה[#]?.)([^#\s`?]*): תופס אפס או יותר תווים שאינם סימן hash, רווח, גרש אחורי, או סימן שאלה.
5. מקטע (קבוצה 5): [#]?([^#\s’”`.,!]*)
- מטרה: תופס באופן אופציונלי את מזהה המקטע המתחיל ב‑
#. הסבר:
[#]?: תופס באופן אופציונלי#.([^#\s’”`.,!]*): תופס אפס או יותר תווים שאינם סימני פיסוק או רווחים אסורים.
🛠️ דוגמת ניתוח
כך אפשר להפעיל את הרגקס המפחיד הזה, עם מעט קוד JavaScript:
const text = `Check this out: https://example.com/path?query=123#sectionAnd also (ftp://files.server.org/index).Plus a weird one: custom-scheme://host/param;weird^stuff`;
const urlRegex = /([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)/gi;
const matches = [ ...text.matchAll(urlRegex),].map((match) => match[0]);console.log("Extracted URLs:", matches);
const parts = [ ...text.matchAll(urlRegex),].map((match) => match.slice(1));console.log("Extracted Parts:", parts);[ "https://example.com/path?query=123#section", "ftp://files.server.org/index", "custom-scheme://host/param;weird^stuff"][ [ "https://", // Protocol "example.com", // Domain "/path", // Path "query=123", // Query "section" // Fragment ], [ "ftp://", // Protocol "files.server.org", // Domain "/index", // Path "", // Query "" // Fragment ], [ "custom-scheme://", // Protocol "host", // Domain "/param;weird^stuff", // Path "", // Query "" // Fragment ]]☑️ צעדים הבאים
בהתאם למקרה השימוש שלכם, ייתכן שיהיה צורך לחדד את הרגקס הזה או להוסיף שלבי אימות ועיבוד נוספים.
פרויקטים שונים, צרכים שונים
לפרויקטים יש דרישות שונות וחששות בטחוניים:
- סריקת אינטרנט: אימות כתובות URL כדי לוודא שהן נגישות ואמינות.
- עיבוד נתונים: חילוץ כתובות URL מתוכן שנוצר על‑ידי משתמשים תוך שמירה על בטיחות.
- ניתוח נתונים: סינון קישורים משוכפלים או לא רלוונטיים למטרות מחקר או שיווק.
- יישומים למשתמשים: הוספת קישורים אוטומטית ל‑URL בצ’אט או בפורומים.
עיבוד נוסף ואימות
לאחר איסוף כתובות URL פוטנציאליות, יש לבצע בדיקות נוספות:
- בדיקת DNS: אימות שהדומיינים נפתרים.
- בדיקות בטיחות: שימוש בשירותים לבדיקת אתרים זדוניים או פישינג.
- כללים מותאמים: יישום מסננים ספציפיים לפרויקט (לדוגמה, TLDים מורשים, אורך מקסימלי של URL).
📝 סיכום
חילוץ נתוני מחרוזת חצי‑מבנה עשוי להיות החלק המספק ביותר במיומנות הרגקס.
הנה סיכום של הנקודות המרכזיות:
- השתמשו בכלי חזותי לכתיבה, בדיקה והבנת ה‑תבניות Regex שלכם.
- פצלו את האתגר לחלקים ופתרו כל חלק בנפרד. במובן מסוים, קבוצות לכידה משמשות כ„סימני דרך“ לדמיון שלנו ברגקס.
- השתמשו בביטויים „רפויים“, הימנעו מציות קפדנית למפרט בעת קבלת נתונים.
- הוספת שלבי אימות אחרי החילוץ הראשוני היא קריטית — תמיד קחו בחשבון את האבטחה והצרכים הספציפיים של הפרויקט.
על‑ידי ביצוע הצעדים האלה, תוכלו לחלץ ביעילות כל מחרוזת חצי‑מובנית, ולבסס את הבסיס לעיבוד ולאימות נוספים.
📚 למידה נוספת
- זכרו לשחק עם הדגמה חיה ב‑RegEx101.com!
- שאלת StackOverflow המקורית, וקישור לתשובה שלי כאן.
- תיעוד MDN על ביטויים רגולריים
- טכניקות Regex מתקדמות: חקרו lookaheads, lookbehinds, ותבניות מתקדמות אחרות להתאמה מדויקת יותר.
- RFC 3986 – תחביר URI גנרי