النصوص (متقدم)

مقدمة

هذا الدرس هو تكملة لدرس النصوص (مستوى متوسط) لذلك ننصح بمراجعته أولاً ثم العودة لقراءة الدرس

لماذا هذا الدرس؟

تعلمنا اﻷمور اﻷساسية عن النصوص، لكن في بعض اﻷحيان نحتاج لإجراء عمليات أكثر على النصوص لحل مشكلات برمجية معينة، تأمل معي المشكلات التالية:

  • تخيل أننا نعمل على برمجة نظام تعليقات، وعندما يرسل المستخدم تعليق جديد نريد أن نبحث في النص عن كلمات بذيئة غير مسموح بها وإذا وجدناها نمنعه من إنشاء تعليق جديد، كيف يمكننا القيام بها؟
  • لنتخيل أننا نعمل على برمجة نظام تسجيل.. تسجيل حساب جديد، ويقوم المستخدم بإدخال البريد اﻹلكتروني، لكننا نريد أن نسمح فقط ببريد إلكتروني @gmail.com حتى لا يدخل المستخدمون بأي بريد إلكتروني من خدمات ونطاقات غير معروفة، فمثلاً إن قام بإدخال بريد إلكتروني @test.com نمنعه ونطلب منه إدخال بريد إلكتروني صحيح

اقتطاع النص

الدالة slice()

يمكنك استخدام الدالة slice() في اقتطاع النص... أي أخذ جزء محدد من النص، وتأخذ الدالة مُدخلين.. المدخل الأول هو مفتاح بداية الإقتطاع (من)، والمُدخل الثاني هو مفتاح نهاية اﻹقتطاع (إلى).

النص (string) هو عبارة عن سلسلة من اﻷحرف، ولكل حرف مفتاح يعبر عن ترتيبه كعناصر المصفوفات بالضبط.

تذكر أن: في البرمجة يبدأ العدّ من صفر، بالتالي الحرف اﻷول ترتيبه 0

var text = "DalilMobarmg";
console.log(text.slice(2, 5));
ناتج التشغيل lil

في المثال السابق اقتطعنا النص من الحرف الذي ترتيبه (2) إلى الحرف الذي ترتيبه (5)، بالتالي كانت النتيجة نص به الحرف الثالث والرابع والخامس

اﻹقتطاع إلى النهاية

يمكنك ألّا تحدد مُدخل النهاية وستقوم الدالة تلقائياً باﻹقتطاع حتى نهاية النص، فمثلاً نريد اﻹقتطاع من الحرف السادس إلى نهاية النص:

var text = "DalilMobarmg";
console.log(text.slice(5));
ناتج التشغيل Mobarmg

الحرف السادس مُفتاحه 5 ﻷن العد يبدأ من صفر

الدالة substr()

تعمل تقريباً نفس عمل الدالة slice() والفرق هو أن المُدخل الثاني ليس مُفتاح نهاية اﻹقتطاع، ولكن طول اﻹقتطاع (عدد الحروف التي تريد اقتطاعها بعد حرف البداية)

var text = "DalilMobarmg";
console.log(text.substr(5, 2));
ناتج التشغيل Mo

في المثال السابق تقوم الدالة باقتطاع حرفين بدءاً من الحرف السادس (مفتاحه 5)

البحث في النصوص

تخيل أننا نعمل على برمجة نظام تعليقات، وعندما يرسل المستخدم تعليق جديد نريد أن نبحث في النص عن كلمات بذيئة غير مسموح بها وإذا وجدناها نمنعه من إنشاء تعليق جديد، كيف يمكننا القيام بها؟

تُستخدم للبحث في النصوص عن نص معين، وإذا وجدت النص تقوم بإرجاع مُفتاح (ترتيب) النتيجة، غير ذلك تقوم بإرجاع -1

في البرمجة: القيمة -1 في البحث تعني "غير موجود"

مثال البحث عن كلمة "النجوم" في نص

var text = "فلا تقنع بما دون النجوم"
console.log( text.search("النجوم") );
ناتج التشغيل 17

ناتج البحث 17 ﻷن هذا هو ترتيب أول حروف كلمة "النجوم" في النص... موضعها الحرف الثامن عشر...

التحقق من وجود كلمة

لنتحقق هل الكلمة موجودة في النص أم لا، يمكننا استخدام الشروط في التحقق من أن ناتج البحث لا يساوي -1 ، ﻷنه إذا لم يساوي -1 فإن ذلك يعني أن هناك نتائج للبحث.

مثال البحث عن كلمة "النجوم" في مقولة للإمام الشافعي لا تحتوي على كلمة النجوم:

var text = "وذو جهل قد ينام على حرير وذو علم مفارشه التراب"
if (text.search("النجوم") != -1){
  console.log("تم إيجاد الكلمة");
}else{
  console.log("الكلمة غير موجودة");
}
ناتج التشغيل الكلمة غير موجودة

مثال آخر للبحث عن كلمة موجودة:

var text = "وذو جهل قد ينام على حرير وذو علم مفارشه التراب"
if (text.search("علم") != -1){
  console.log("تم إيجاد الكلمة");
}else{
  console.log("الكلمة غير موجودة");
}
ناتج التشغيل تم إيجاد الكلمة

انتبه: الحاسوب يعتبر الحرف "A" يختلف عن الحرف "a"، لذلك انتبه أثناء البحث في النصوص لهذه المعلومة، وقم بتحويل النص إلى حروف small أولاً إذا كنت تبحث في نص باﻹنجليزية.

ويُمكن تحسين المثال السابق ليدعم البحث عن عدة كلمات، وإذا تم إيجاد أحد هذه الكلمات يطبع true غير ذلك يطبع false

الخوارزمية:

  • تعريف مصفوفة تحتوي على الكلمات التي نريد البحث عنها
  • إنشاء متغير اسمه found قيمته false، سنقوم بتغيير قيمته إلى true إذا تم إيجاد كلمة من كلمات البحث.
  • حلقة تكرارية للوصول لكل عناصر المصفوفة (كلمات البحث)
    • البحث عن الكلمة في النص، إذا وُجدت يتم تغيير قيمة found إلى true.
var text = "وذو جهل قد ينام على حرير وذو علم مفارشه التراب";
var words = ["النجوم", "السماء", "علم", "اﻷرض"];
var found = false;
words.forEach(function(word){
  if (text.search(word) !== -1){
    found = true;
  }
});

console.log(found)
ناتج التشغيل true

الناتج true ﻷنه وجد كلمة "علم" في النص، جرب تغييرها بكلمة أخرى وانظر الناتج!

تحويل النص إلى مصفوفة

في بعض لغات البرمجة تكون الدوال التي تسمح لك بإجراء عمليات على النصوص قليلة، لذلك يمكنك تحويل النص إلى مصفوفة ومن هنا نستطيع التحكم كلياً بالنص وإجراء عمليات متقدمة عليه واﻹستفادة بكل مميزات المصفوفات وقوتها في هيكلة البيانات

الدالة split()

تُستخدم الدالة split في تحويل النص إلى مصفوفة

وتأخذ مُدخل واحد وهو الفاصل الذي بناءا عليه سيتم تقسيم النص، فإن كان الفاصل مسافة " " سيتم تقسيم النص إلى كلمات، وإن كان الفاصل نص فارغ "" سيتم تقسيم النص إلى حروف، وهكذا...

var text = "دليل مبرمج";
var textArray = text.split(" ");
console.log(textArray);
ناتج التشغيل ["دليل", "مبرمج"]

تم تقسيم النص إلى كلمتين ﻷننا حددنا الفاصل " " أي المسافة.

ويمكننا التعامل مع المصفوفة كأي مصفوفة، مثلاً يمكن طباعة العنصر اﻷول (الكلمة اﻷولى)

var text = "دليل مبرمج";
var textArray = text.split(" ");
console.log(textArray[0]);
ناتج التشغيل دليل
var text = "دليل مبرمج";
var textArray = text.split("");
console.log(textArray);
ناتج التشغيل ["د", "ل", "ي", "ل", " ", "م", "ب", "ر", "م", "ج"]

تم تقسيم النص إلى حروف، ﻷننا حددنا الفاصل نص فارغ ""

مثال التحقق من البريد اﻹلكتروني

كما قلنا في مقدمة الدرس:

لنتخيل أننا نعمل على برمجة نظام تسجيل.. تسجيل حساب جديد، ويقوم المستخدم بإدخال البريد اﻹلكتروني، لكننا نريد أن نسمح فقط ببريد إلكتروني @gmail.com حتى لا يدخل المستخدمون بأي بريد إلكتروني من خدمات ونطاقات غير معروفة، فمثلاً إن قام بإدخال بريد إلكتروني @test.com نمنعه

يمكن تنفيذ هذا البرنامج بعدة خوارزميات، مثلاً يمكننا البحث عن "@gmail.com" في البريد اﻹلكتروني وإذا لم نجدها نمنعه، لكن هناك خوارزمية أفضل وهي استخدام split فيمكننا تحويل البريد اﻹلكتروني إلى مصفوفة باستخدام الفاصل @ وبالتالي سيكون عناصر المصفوفة اﻷول هو ما قبل @ والثاني هو ما بعدها، وهذا ما نحتاجه، فما بعد @ هو النطاق الذي نريد التحقق منه...

var email = "ebrahim@test.com"
var emailArray = email.split("@");
console.log(emailArray[1]);
ناتج التشغيل test.com

في المثال السابق قمنا بطباعة العنصر الثاني من المصفوفة، وهو النطاق الذي نريد التحقق منه.

اﻵن يمكننا تنفيذ ما نريد بسهولة

var email = "ebrahim@test.com"
var emailArray = email.split("@");
var domain = emailArray[1];
if (domain != "gmail.com"){
  console.log("أدخل بريد إلكتروني صحيح");
}else{
  console.log("تم التسجيل بنجاح");
}
ناتج التشغيل أدخل بريد إلكتروني صحيح

ويمكننا استخدام الدوال أفضل:

function checkEmail(email){
  var emailArray = email.split("@");
  var domain = emailArray[1];
  if (domain != "gmail.com"){
    console.log("غير صحيح");
  }else{
    console.log("صحيح");
  }  
}

checkEmail("ebrahim@test.com");
checkEmail("ebrahim@gmail.com");
checkEmail("ebrahim@dalilmobarmg.com");
ناتج التشغيل غير صحيح
صحيح
غير صحيح

الدالة join()

تقوم بعكس ما تقوم به الدالة split() فهي تقوم بتحويل المصفوفة إلى نص، وتأخذ مُدخل واحد هو الفاصل، حيث تضيف هذا الفاصل بين كل عنصر من عناصر المصفوفة في النص الجديد.

var textArray = ["دليل", "مبرمج"];
console.log(textArray.join(""));
console.log(textArray.join(" "));
console.log(textArray.join("-"));
console.log(textArray.join(","));
ناتج التشغيل دليلمبرمج
دليل مبرمج
دليل-مبرمج
دليل,مبرمج

المساهمين

وجدت خطأ أو تريد المساهمة في محتوى الدرس؟ عدل الصفحة على Github