دليل شامل لاستخلاص النصوص الفرعية في JavaScript: مقارنة بين دوال `substring()` و `slice()` و `substr()`
في عالم البرمجة اليومي، تُعد معالجة النصوص (Strings) جزءًا لا يتجزأ من مهامنا. لحسن الحظ، يوفر لنا JavaScript مجموعة غنية من الدوال المدمجة التي تُسهل التعامل مع أنواع البيانات المختلفة مثل المصفوفات (Arrays) والنصوص (Strings) وغيرها. يمكننا استخدام هذه الدوال لإجراء عمليات متنوعة مثل البحث، الاستبدال، ودمج النصوص.
من بين العمليات الأكثر شيوعًا في JavaScript هي استخلاص جزء من نص معين، أو ما يُعرف بالنص الفرعي (Substring). في هذا المقال، سنتعمق في كيفية الحصول على نص فرعي باستخدام ثلاث دوال مختلفة ومدمجة في اللغة. ولكن قبل ذلك، دعونا نوضح بإيجاز ما هو النص الفرعي.
ما هو النص الفرعي (Substring)؟
النص الفرعي هو ببساطة جزء أو مجموعة جزئية من نص آخر أكبر. تخيل أن لديك جملة طويلة، والنص الفرعي هو مقطع صغير من هذه الجملة.
"I am learning JavaScript and it is cool!" --> النص الأصلي
"I am learning JavaScript" --> نص فرعي
"JavaScript is cool!" --> نص فرعي آخر
كما يوضح المثال أعلاه، في بعض الحالات نحتاج إلى استخراج نص فرعي واحد أو أكثر من جملة كاملة أو فقرة. الآن، دعنا نستكشف كيف يمكننا تحقيق ذلك في JavaScript بثلاث طرق مختلفة.
1. استخدام الدالة `substring()`
لنبدأ بالدالة substring(). تقوم هذه الدالة بشكل أساسي باستخراج جزء من النص الأصلي وإعادته كنص جديد. تتطلب دالة substring() معاملين:
string.substring(startIndex, endIndex);
startIndex: يمثل نقطة البداية للنص الفرعي (مؤشر الحرف الأول الذي سيتم تضمينه).endIndex: يمثل نقطة النهاية للنص الفرعي (مؤشر الحرف الذي لن يتم تضمينه، وهو اختياري).
دعنا نرى مثالًا عمليًا. لنفترض أن لدينا النص التالي:
const myString = "I am learning JavaScript and it is cool!";
إذا قمنا بتعيين startIndex على 0 و endIndex على 10، فسنحصل على أول 10 أحرف من النص الأصلي. تذكر دائمًا أن فهرس الحرف الأول هو 0.
أما إذا قمنا بتعيين startIndex فقط دون تحديد endIndex، فسنحصل على نص فرعي يبدأ من الفهرس المحدد ويمتد حتى نهاية النص الأصلي:
نقاط إضافية حول `substring()`:
- إذا كان
startIndexيساويendIndex، تُرجع الدالةsubstring()نصًا فارغًا. - إذا كان كل من
startIndexوendIndexأكبر من طول النص الأصلي، تُرجع الدالة نصًا فارغًا. - إذا كان
startIndexأكبر منendIndex، تقوم الدالةsubstring()بتبديل المعاملين تلقائيًا وتُرجع نصًا فرعيًا كما لو كانendIndexأكبر منstartIndex.
2. استخدام الدالة `slice()`
تُعد الدالة slice() مشابهة جدًا للدالة substring()، وهي أيضًا تُرجع نصًا فرعيًا من النص الأصلي. تتطلب دالة slice() نفس المعاملين:
string.slice(startIndex, endIndex);
startIndex: يمثل نقطة البداية للنص الفرعي.endIndex: يمثل نقطة النهاية للنص الفرعي (اختياري).
نقاط مشتركة بين `substring()` و `slice()`:
- إذا لم نحدد
endIndex، فسنحصل على نص فرعي يبدأ من الفهرس المعطى ويمتد حتى نهاية النص الأصلي.
- إذا قمنا بتعيين كل من
startIndexوendIndex، فسنحصل على الأحرف الواقعة بين الفهرسين المحددين من النص الأصلي.
- إذا كان كل من
startIndexوendIndexأكبر من طول النص، تُرجع الدالة نصًا فارغًا.
اختلافات الدالة `slice()`:
- إذا كان
startIndexأكبر منendIndex، تُرجع الدالةslice()نصًا فارغًا (على عكسsubstring()التي تقوم بتبديل المعاملات). - إذا كان
startIndexرقمًا سالبًا، يبدأ استخلاص النص من نهاية النص الأصلي (أي العد العكسي).
ملاحظة: يمكن استخدام الدالة slice() أيضًا مع مصفوفات JavaScript، مما يجعلها أداة متعددة الاستخدامات.
3. استخدام الدالة `substr()`
وفقًا لوثائق Mozilla، تُعتبر الدالة substr() دالة قديمة (legacy function) ويجب تجنب استخدامها في المشاريع الجديدة. ومع ذلك، سأشرح بإيجاز ما تفعله، لأنه قد تصادفها في المشاريع القديمة أو قواعد الأكواد الموجودة.
تُرجع الدالة substr() أيضًا نصًا فرعيًا من النص الأصلي وتتطلب معاملين:
string.substr(startIndex, length);
startIndex: يمثل نقطة البداية للنص الفرعي.length: عدد الأحرف المراد تضمينها في النص الفرعي (اختياري).
هنا يكمن الاختلاف الجوهري: تتوقع الدالة substr() المعامل الثاني كـ length (طول) بدلاً من endIndex (فهرس النهاية).
في هذا المثال، تقوم الدالة بعد 5 أحرف بدءًا من startIndex المحدد وإعادتها كنص فرعي. ومع ذلك، إذا لم نحدد المعامل الثاني (length)، فإنها تُرجع النص حتى نهاية النص الأصلي (تمامًا كما تفعل الدالتان السابقتان):
ملاحظة هامة: جميع هذه الدوال الثلاث (substring()، slice()، و substr()) تُرجع النص الفرعي كنص جديد، ولا تُغير النص الأصلي أبدًا.
الخلاصة التقنية
لقد استعرضنا في هذا المقال ثلاث طرق أساسية لاستخلاص النصوص الفرعية في JavaScript: دوال substring()، slice()، و substr(). من الضروري فهم الفروقات الدقيقة بينها لاختيار الأداة الأنسب لكل مهمة. بينما تُعد substring() و slice() الخيارات المفضلة في التطوير الحديث، مع تفضيل slice() لقدرتها على التعامل مع الفهارس السالبة ومرونتها الأكبر، يجب تجنب substr() نظرًا لكونها دالة قديمة وقد تُزال في الإصدارات المستقبلية من JavaScript. تذكر دائمًا أن هذه الدوال لا تُعدّل النص الأصلي، بل تُنشئ نسخة جديدة منه، مما يحافظ على سلامة البيانات الأصلية في تطبيقك.