النصوص (متقدم)
مقدمة
هذا الدرس هو تكملة لدرس النصوص (مستوى متوسط) لذلك ننصح بمراجعته أولاً ثم العودة لقراءة الدرس
لماذا هذا الدرس؟
تعلمنا اﻷمور اﻷساسية عن النصوص، لكن في بعض اﻷحيان نحتاج لإجراء عمليات أكثر على النصوص لحل مشكلات برمجية معينة، تأمل معي المشكلات التالية:
- تخيل أننا نعمل على برمجة نظام تعليقات، وعندما يرسل المستخدم تعليق جديد نريد أن نبحث في النص عن كلمات بذيئة غير مسموح بها وإذا وجدناها نمنعه من إنشاء تعليق جديد، كيف يمكننا القيام بها؟
- لنتخيل أننا نعمل على برمجة نظام تسجيل.. تسجيل حساب جديد، ويقوم المستخدم بإدخال البريد اﻹلكتروني، لكننا نريد أن نسمح فقط ببريد إلكتروني
@gmail.com
حتى لا يدخل المستخدمون بأي بريد إلكتروني من خدمات ونطاقات غير معروفة، فمثلاً إن قام بإدخال بريد إلكتروني@test.com
نمنعه ونطلب منه إدخال بريد إلكتروني صحيح
اقتطاع النص
slice()
الدالة يمكنك استخدام الدالة slice()
في اقتطاع النص... أي أخذ جزء محدد من النص، وتأخذ الدالة مُدخلين.. المدخل الأول هو مفتاح بداية الإقتطاع (من)، والمُدخل الثاني هو مفتاح نهاية اﻹقتطاع (إلى).
النص (string) هو عبارة عن سلسلة من اﻷحرف، ولكل حرف مفتاح يعبر عن ترتيبه كعناصر المصفوفات بالضبط.
تذكر أن: في البرمجة يبدأ العدّ من صفر، بالتالي الحرف اﻷول ترتيبه 0
var text = "DalilMobarmg";
console.log(text.slice(2, 5));
في المثال السابق اقتطعنا النص من الحرف الذي ترتيبه (2) إلى الحرف الذي ترتيبه (5)، بالتالي كانت النتيجة نص به الحرف الثالث والرابع والخامس
اﻹقتطاع إلى النهاية
يمكنك ألّا تحدد مُدخل النهاية وستقوم الدالة تلقائياً باﻹقتطاع حتى نهاية النص، فمثلاً نريد اﻹقتطاع من الحرف السادس إلى نهاية النص:
var text = "DalilMobarmg";
console.log(text.slice(5));
الحرف السادس مُفتاحه
5
ﻷن العد يبدأ من صفر
substr()
الدالة تعمل تقريباً نفس عمل الدالة slice()
والفرق هو أن المُدخل الثاني ليس مُفتاح نهاية اﻹقتطاع، ولكن طول اﻹقتطاع (عدد الحروف التي تريد اقتطاعها بعد حرف البداية)
var text = "DalilMobarmg";
console.log(text.substr(5, 2));
في المثال السابق تقوم الدالة باقتطاع حرفين بدءاً من الحرف السادس (مفتاحه 5)
البحث في النصوص
تخيل أننا نعمل على برمجة نظام تعليقات، وعندما يرسل المستخدم تعليق جديد نريد أن نبحث في النص عن كلمات بذيئة غير مسموح بها وإذا وجدناها نمنعه من إنشاء تعليق جديد، كيف يمكننا القيام بها؟
search()
الدالة تُستخدم للبحث في النصوص عن نص معين، وإذا وجدت النص تقوم بإرجاع مُفتاح (ترتيب) النتيجة، غير ذلك تقوم بإرجاع -1
في البرمجة: القيمة -1
في البحث تعني "غير موجود"
مثال البحث عن كلمة "النجوم" في نص
var text = "فلا تقنع بما دون النجوم"
console.log( text.search("النجوم") );
ناتج البحث 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
ﻷنه وجد كلمة "علم" في النص، جرب تغييرها بكلمة أخرى وانظر الناتج!
تحويل النص إلى مصفوفة
في بعض لغات البرمجة تكون الدوال التي تسمح لك بإجراء عمليات على النصوص قليلة، لذلك يمكنك تحويل النص إلى مصفوفة ومن هنا نستطيع التحكم كلياً بالنص وإجراء عمليات متقدمة عليه واﻹستفادة بكل مميزات المصفوفات وقوتها في هيكلة البيانات
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]);
في المثال السابق قمنا بطباعة العنصر الثاني من المصفوفة، وهو النطاق الذي نريد التحقق منه.
اﻵن يمكننا تنفيذ ما نريد بسهولة
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