🔍 البحث في النصوص في JavaScript: أدواتك السحرية للعثور على أي شيء!

تخيل أن لديك كتاباً ضخماً وتريد العثور على فقرة معينة بداخله. بدلاً من قراءة كل صفحة، ستستخدم فهرساً أو خاصية البحث. في عالم JavaScript، النصوص (Strings) هي كتبنا، ولدينا مجموعة رائعة من الأدوات للبحث بداخلها بسرعة وسهولة. اليوم سنتعلم هذه الأدوات معاً خطوة بخطوة.

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


📝 لماذا نحتاج للبحث في النصوص؟

قبل الغوص في الأكواد، لنتعرف على بعض السيناريوهات الواقعية البسيطة:

  • التحقق مما إذا كان بريد المستخدم الإلكتروني يحتوي على الرمز "@".
  • البحث عن كلمة "عرض" في وصف منتج ما.
  • التأكد من أن اسم الملف ينتهي بـ ".pdf".
  • معرفة إذا كان النص يبدأ بكلمة "السيد" أم "السيدة".

كل هذه المهام وأكثر يمكن حلها بسهولة باستخدام دوال البحث في النصوص!


includes(): الدالة الأبسط "هل يحتوي على...؟"

هذه الدالة هي الأسهل على الإطلاق! وظيفتها بسيطة: تخبرنا إذا كان النص يحتوي على النص الذي نبحث عنه أم لا. تعيد لنا true (صح) إذا وجدته، و false (خطأ) إذا لم تجده.

صياغتها:

string.includes(searchValue);

مثال عملي:

let greeting = "Welcome to Codex Academy";

// التحقق من وجود كلمة "Codex" في التحية
let result = greeting.includes("Codex");
console.log(result); // ستطبع: true

// التحقق من وجود كلمة "Java"
let result2 = greeting.includes("Java");
console.log(result2); // ستطبع: false

💡 ملاحظة: البحث حساس لحالة الأحرف (Case-Sensitive). يعني أن "Codex" تختلف عن "codex".


📍 indexOf() و lastIndexOf(): "أين يوجد بالضبط؟"

ماذا لو أردنا لا نعرف فقط إذا كان النص موجوداً، بل أين يوجد؟ هنا تأتي دور indexOf().

وظيفتها: تعيد رقم الفهرس (الموقع) لأول ظهور للنص الذي نبحث عنه. إذا لم تجده، تعيد الرقم -1.

صياغتها:

string.indexOf(searchValue);

مثال عملي:

let sentence = "تعلم البرمجة متعة، تعلم البرمجة قوة";

let position = sentence.indexOf("برمجة");
console.log(position); // ستطبع: 6 (موقع أول حرف من كلمة "برمجة")

let notFound = sentence.indexOf("جافا");
console.log(notFound); // ستطبع: -1

// يمكننا أيضاً البحث بدءاً من فهرس محدد
let position2 = sentence.indexOf("برمجة", 10); // ابحث عن "برمجة" بدءاً من الفهرس 10
console.log(position2); // ستطبع: 27 (موقع كلمة "برمجة" الثانية)

و lastIndexOf()؟ هي نفس الفكرة، لكنها تبحث عن آخر ظهور للنص في السلسلة، وليس الأول.

let lastPosition = sentence.lastIndexOf("برمجة");
console.log(lastPosition); // ستطبع: 27

🎯 startsWith() و endsWith(): التحقق من البداية والنهاية

هاتان الدالتان متخصصتان للغاية ومفيدتان جداً في التحقق من تنسيق الأشياء.

startsWith(): تتحقق مما إذا كان النص يبدأ بالنص المحدد. endsWith(): تتحقق مما إذا كان النص ينتهي بالنص المحدد.

مثال عملي:

let filename = "التقرير_السنوي.pdf";
let url = "https://www.codex-academy.org";

// التحقق من امتداد الملف
let isPDF = filename.endsWith(".pdf");
console.log(isPDF); // true

// التحقق إذا كان الرابط آمن (يبدأ بـ https)
let isSecure = url.startsWith("https://");
console.log(isSecure); // true

// التحقق إذا كان العنوان يبدأ بـ "السيد"
let name = "السيد أحمد";
let isMr = name.startsWith("السيد");
console.log(isMr); // true

🔤 search(): البحث باستخدام التعبيرات النمطية (لمحة بسيطة)

دالة search() تشبه indexOf()، لكنها تتميز بقدرتها على البحث باستخدام التعبيرات النمطية البسيطة، وهي أدوات بحث أكثر قوة ومرونة (سنفرد لها درساً مستقبلياً).

صياغتها:

string.search(searchValue);

مثال عملي:

let text = "تاريخ اليوم هو 2023-10-27";

// البحث عن أول ظهور لأي رقم في النص
let pos = text.search(/\d/); // \d ترمز إلى أي رقم (0-9)
console.log(pos); // ستطبع: 14 (موقع الرقم 2 في التاريخ)

// يمكن استخدامها كنص عادي أيضاً
let pos2 = text.search("هو");
console.log(pos2); // ستطبع: 11

🧪 لنجرب معاً: مثال تطبيقي شامل

لنقم ببناء مثال بسيط يحاكي التحقق من عنوان بريد إلكتروني:

// مثال: التحقق من صحة أساسية لبريد إلكتروني
function checkBasicEmail(email) {
    // 1. التحقق إذا كان يحتوي على الرمز @
    let hasAtSymbol = email.includes("@");
    
    // 2. التحقق إذا كان ينتهي بـ .com
    let endsWithCom = email.endsWith(".com");
    
    // 3. إرجاع نتيجة التحقق
    if (hasAtSymbol && endsWithCom) {
        return "البريد الإلكتروني يبدو صحيحاً من حيث الشكل الأساسي ✅";
    } else {
        return "يرجى التأكد من صحة البريد الإلكتروني ❌";
    }
}

// دعنا نختبر الدالة
let userEmail = "student@codex-academy.org";
console.log(checkBasicEmail(userEmail));
// ستطبع: "البريد الإلكتروني يبدو صحيحاً من حيث الشكل الأساسي ✅"

let wrongEmail = "student.codex-academy.org";
console.log(checkBasicEmail(wrongEmail));
// ستطبع: "يرجى التأكد من صحة البريد الإلكتروني ❌"

💡 ملخص سريع: أي دالة تستخدم ومتى؟

  • includes(): عندما تريد معرفة إذا كان النص موجوداً فقط (true/false). الأسهل والأكثر استخداماً.
  • indexOf() / lastIndexOf(): عندما تريد معرفة موقع النص (رقم الفهرس).
  • startsWith() / endsWith(): عندما تريد التحقق من بداية أو نهاية النص تحديداً.
  • search(): عندما تحتاج بحثاً أكثر قوة باستخدام أنماط بسيطة (مثل البحث عن أرقام).