DanLevy.net

من الصفر إلى بطل الـRegex

استخراج وتحليل السلاسل الشبيهة بـ URL باستخدام تعبير نمطي واحد

فهرس المحتويات

TL;DR: انتقل مباشرة إلى الـ 120+ بايت من Regex.

🚀 المقدمة

استخراج الروابط من النص الخام قد يشعر أحيانًا كأنك تلعب لعبة شاقة من “ضرب الفئران”. علامات الترقيم، الأقواس، والتنسيق الغامض كلها تتآمر لتعقّب جهودك. سواءً كنت تبني أداة جمع بيانات ويب، محلل بيانات، أو تطبيق دردشة، فإن استخراج الروابط بدقة أمر أساسي.

في هذه المقالة، سنواجه المشكلة مباشرةً باستخدام نهج مرن من خطوتين. هدفنا هو التقاط جميع السلاسل التي قد تشبه الروابط أولًا ثم التعامل مع التحقق في عملية لاحقة.

💡 ملاحظة: هذا النمط ليس لـ التحقق من صحة الروابط! إنه متساهل عمدًا مع علامات الترقيم والأخطاء الإملائية.

🔍 الهدف: استخراج الروابط من النص

عند استخراج الروابط من النص الخام، يكون النهج ذو الخطوتين فعالًا:

  1. التقاط كل ما يشبه الرابط: صِدّ شبكة واسعة لالتقاط جميع السلاسل التي قد تكون روابط. هنا يبرز «تعبير regex بحجم 120+ بايت».
  2. التحقق: بعد أن تلتقط هذه المرشحات، استخدم فحوصًا ثانوية (مثل حل DNS، أو المقارنة مع نطاقات معروفة) لتصفية الإدخالات غير الصالحة.

تصور التحدي

تُستَخدم مصطلحات extract و parse غالبًا بصورة متبادلة، لكنهما تشير إلى عمليتين مميزتين. استخراج الروابط يعني تحديد والتقاط الروابط المحتملة من نص أكبر. أما التحليل (parsing) فيعني تفكيك هذه الروابط إلى أجزائها المكوّنة.

عندما أتحدث عن التحليل أو «أجزاء الرابط»، فأنا أقصد المكوّنات التالية:

الأجزاء الخمسة لجميع الروابط
URL anatomy, visualized

انقر لعرض لقطة شاشة لمطابقة السلاسل الفرعية في RegEx101.

قبل الغوص عميقًا في التعبير النمطي، دعنا نستخدم أداة بصرية لنرى مدى قدرة نمطنا على التقاط العديد من المطابقات:

استخدام RegEx101.com لتصور المطابقات متعددة الأسطر
Preview 'bulk' multi-line matches

تعبير regex بحجم 120+ بايت

فيما يلي تعبير نمطي مختصر صُمم لاستخراج وتحليل الروابط في خطوة واحدة. يدعم بروتوكولات مختلفة، ونطاقات، ومسارات، وأقسام استعلام/جزء اختيارية.

لا تقلق — سنفصّله خطوة بخطوة!

120+ Byte URL Regex
const urlRegex = /([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)/gi;
// Compatibility: ES5+
// نفس النمط، مقسّم على أسطر لسهولة القراءة:
([-.a-z0-9]+:\/{1,3})
([^-\/\.[\](|)\s?][^`\/\s\]?]+)
([-_a-z0-9!@$%^&*()=+;/~\.]*)
[?]?([^#\s`?]*)
[#]?([^#\s'"`\.,!]*)
شارك أجرأ تعبير نمطي صادفته (أو كتبته) في التعليقات أدناه! 🚀

🧩 تفصيله خطوة بخطوة

دعونا نفكك التعبير النمطي إلى مكوّناته لفهم طريقة عمله:

1. البروتوكول (المجموعة 1): ([-.a-z0-9]+:/{1,3})

2. النطاق (المجموعة 2): ([^-/.[](|)s?][^`/s]?]+)

3. المسار (المجموعة 3): ([-_a-z0-9!@$%^&*()=+;/~\.]*)

4. الاستعلام (المجموعة 4): [?]?([^#\s`?]*)

5. الجزء المقطّع (المجموعة 5): [#]?([^#\s’”`.,!]*)

🛠️ مثال على التحليل

إليك كيفية تشغيل هذا التعبير النمطي الضخم باستخدام قليل من JavaScript:

☑️ الخطوات التالية

اعتمادًا على حالتك، قد تحتاج إلى صقل هذا التعبير النمطي أو إضافة المزيد من خطوات التحقق والمعالجة اللاحقة.

مشاريع مختلفة، احتياجات مختلفة

المشاريع لها متطلبات ومخاوف أمنية متفاوتة:

  1. استخلاص الويب: التحقق من صحة عناوين URL لضمان إمكانية الوصول إليها وثقتها.
  2. معالجة البيانات: استخراج عناوين URL من المحتوى الذي يولده المستخدم مع الحفاظ على الأمان.
  3. تحليل البيانات: تصفية الروابط المكررة أو غير ذات الصلة لأغراض البحث أو التسويق.
  4. التطبيقات الموجهة للمستخدم: تحويل عناوين URL تلقائيًا إلى روابط في تطبيقات الدردشة أو المنتديات.

ما بعد المعالجة والتحقق

بعد جمع عناوين URL المحتملة، طبّق فحوصات إضافية:

📝 ملخص

استخلاص البيانات النصية شبه المهيكلة قد يكون أكثر جوانب إتقان الـ regex إرضاءً.

إليك ملخص للنقاط الرئيسية:

باتباع هذه الخطوات، يمكنك استخراج أي بيانات نصية شبه مُهيكلة بفعالية، مما يضع الأساس للمعالجة اللاحقة والتحقق.

📚 مزيد من التعلم