عبد الله فتحي

التحقق من المدخلات

8 ردود في هذا الموضوع

التحقق من المدخلات

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

لنفرض أننا طلبنا من المستخدم أن يدخل عنوان بريده الإلكتروني فقام بكتابة اسمه بدلاً من ذلك ( سواء أخطأ أو تعمد الخطأ ) فما العمل حينها ؟؟

هل يتم اعتماد البيانات على ما هي عليه، أم يتم تنبيه المستخدم لذلك الخطأ وتوجيهه إلى إدخال البيانات بشكل صحيح ؟

من البديهي أن لا يتم اعتماد البيانات إلا بعد إدخالها بشكل صحيح ..

إذا قررنا ذلك فسيكون أول ما يلزمنا التفكير به هو كيفية التحقق من مدى صحة البيانات التي أدخلها المستخدم ؟ وهل توجد خوارزمية معينة يتم التحقق من خلالها ؟

ولحسن الحظ أنه يوجد مكتبة معدة خصيصاً لهذا الغرض، ألا وهي مكتبة الـ Microsoft VBScript Regular Expressions والتي نستطيع من خلالها التحقق من تطابق البيانات المدخلة مع صيغة معينة نقوم ( نحن ) بتحديدها ..

ففي المثال السابق أردنا التحقق من صحة البريد الإلكتروني المدخل، وهنا يجب أن نقارنه أولاً بالصيغة التالية [email protected] فإذا تطابق معها فهذا يعني أنه مدخل صحيح، وإذا اختلف فهذا يعني أنه مدخل خاطئ ..

ملحوظة: نحن لا نتحقق هنا من صحة العنوان من ناحية كونه خاص بالمستخدم أم لا، وإنما نتحقق من كون النص المدخل يصلح لأن يكون عنواناً لبريد إلكتروني، مع احتمال أن يدخل المستخدم عنواناً وهمياً، مثلاً [email protected] فهنا سيتم قبوله على اعتبار أنه يتبع الصيغة العامة لعناوين البريد الإلكترونية ..

المكتبة Microsoft VBScript Regular Expressions تحتوي على أربع فئات، هي على التوالي:

Class Match
Class MatchCollection
Class RegExp
Class SubMatches

ما يهمنا أثناء عملية التحقق بشكل أساسي هو الفئة الثالثة RegExp والتي تحتوي على أربع خصائص Properties هي على التوالي:

Property Global As Boolean
Property IgnoreCase As Boolean
Property Multiline As Boolean
Property Pattern As String

بالإضافة إلى ثلاث وظائف Functions هي على التوالي:

Function Execute(sourceString As String) As Object
Function Replace(sourceString As String, replaceVar) As String
Function Test(sourceString As String) As Boolean

جدير بالذكر أن الاستفادة من هذه المكتبة ليس محصوراً على مبرمجي الفيجول بيسيك بل إنه يمكن الاستفادة منها في لغات أخرى، وإن كنا سنعرضها الآن من خلال لغة الفيجول بيسيك 6 ..

قبل أن نبدأ باستخدام المكتبة لابد وأن نضيف مرجع لها من خلال القائمة Project ثم References ثم اختيار المكتبة المذكورة أعلاه، ثم OK، وبذلك نكون قد ضمنا هذه المكتبة في مشروعنا الحالي ..

الخطوة الثانية بأن نقوم بإنشاء نسخة جديدة من الفئة RegExp وذلك من خلا متغير نقوم بتعريفه كالتالي:

Dim RegExp As New RegExp

اسم المتغير هنا هو نفس اسم الفئة، مع الإشارة إلى أنه يمكن استخدام أي اسم آخر حسب الرغبة ..

الآن سيكون كل تعاملنا مع المتغير RegExp والذي يفترض به أن يحمل الأربع خصائص بالإضافة إلى الثلاث وظائف التي ذكرناها سابقاً ..

سنبدأ بإنشاء كود بسيط يقوم بالتحقق من قيمة مدخلة في مربع النص Text1.text إذا ما كانت تطابق الكلمة التالية A-F-R أو لا تطابقها وذلك باستخدام خاصية واحدة فقط ( Pattern ) بالإضافة إلى وظيفة واحدة أيضاً ( Test ) ..

Dim RegExp As New RegExp
RegExp.Pattern = "A-F-R"
Print RegExp.Test(Text1.Text)

كما ترى الكود في قمة البساطة ولا يتعدى الثلاثة أسطر، سنقوم باختباره الآن، وسنلاحظ أنه عند كتابة الكلمة A-F-R في مربع النص فإنه يتم إرجاع القيمة True، وإذا تم إدخال غيرها فإنه سيتم إرجاع القيمة False ..

قد يقول البعض ما هي الفائدة من ذلك حيث أنه يمكن أداء ( نفس ) وظيفة الكود السابق من خلال اختبار مربع النص إذا ما كان يحمل الكلمة A-F-R أم لا، بدون الحاجة إلى مكتبات أو خلافه، وهذا صحيح في مثالنا السابق فقط، ولكن في الأمثلة القادمة سنرى أنه لا بديل عن استخدام هذه المكتبة ..

ابدأ الآن بتجربة الكود السابق أكثر من مرة وانظر ما هي النتيجة !

عند التحقق من الكلمة A-F-R فإنه يتم إرجاع القيمة True

عند التحقق من أي كلمة أخرى فإنه يتم إرجاع القيمة False

ولكن ويا للعجب :P فعند التحقق من الكلمة A-F-R-M فإنه يتم إرجاع القيمة True

وعند التحقق من الكلمة A-A-F-R فإنه يتم إرجاع القيمة True أيضاً

إذا ما السبب في إرجاع القيمة True في المثالين الأخيرين رغم اختلاف الكلمة المُتحقق منها عن الكلمة A-F-R ؟؟

أعتقد أنك قد عرفت السبب الآن .. فإن الوظيفة Test تقوم بالتحقق من وجود التعبير أو الصيغة الموجودة في الخاصية Pattern في النص المراد التحقق منه ( فقط )، ولا يهمها إذا ما كان هناك نص قبلها أو نص بعدها ..

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

فللدلالة على بداية التحقق من حرف محدد نستخدم المعامل ^

وللدلالة على نهاية التحقق إلى حرف محدد نستخدم المعامل $

كيف يكون ذلك ؟

انظر إلى الكود السابق مرة أخرى، ولاحظ الفرق:

Dim RegExp As New RegExp
RegExp.Pattern = "^A-F-R$"
Print RegExp.Test(Text1.Text)

كما ترى لا يوجد فرق كبير، وكل ما في الأمر أننا قمنا بإضافة المعامل ^ قبل الكلمة المراد التحقق منها، وقمنا بإضافة المعامل $ بعد الانتهاء من هذه الكلمة، ولكن الفرق أثناء التنفيذ كبير، حيث أنه لن يتم إرجاع القيمة True إلا إذا كانت الكلمة المدخلة A-F-R دون أي أحرف قبلها أو بعدها ..

الآن جرب الكود السابق أكثر من مرة وتأكد من تنفيذه بشكل صحيح ..

جرب حذف أحد المعاملين السابقين وترك الآخر، ولاحظ الفرق ..

هناك نقطة مهمة هنا وهو أنه في حال إدخال الكلمة a-f-r فإنه لن يتم اعتمادها على اعتبار أن حالة الأحرف قد تغيرت، وإذا كان هذا الأمر يسبب مشكلة بالنسبة لك، فيمكنك تجاهل حالة الأحرف عن طريق تفعيل الخاصية IgnoreCase، ليكون الكود مرة أخرى:

Dim RegExp As New RegExp
RegExp.IgnoreCase = True
RegExp.Pattern = "^A-F-R$"
Print RegExp.Test(Text1.Text)

والآن لنبدأ بأخذ فكرة عن المعاملات الأخرى التي يمكننا استخدامها في الخاصية Pattern:

المعامل .

النقطة، ويسمح هذا المعامل بوجود حرف بديل له ( أياً كان هذا البديل )، مثلاً في الكود السابق لو جعلنا الـ Pattern يساوي "^A-F-.$" فإنه يمكننا التعويض عن مكان النقطة بالحرف R أو بأي حرف آخر ( أو حتى رقم )، وستكون القيمة العائدة عند التحقق True

وتظهر فائدة هذا المعامل في كثير من الصيغ وسنأخذ على سبيل المثال صيغة عنوان البريد الإلكتروني، فنحن لا نعلم ما هو المعرف الخاص بالبريد الإلكتروني المدخل، فلو جعلنا الـ Pattern يساوي "^[email protected]$" هنا سيتم اعتماد المدخلات التالية:

[email protected]

[email protected]

[email protected]

وهكذا ..

ولكن ما ذا لو كان المعرف الخاص بالبريد الإلكتروني يتكون من حرفين مثلاً، هنا سيكون علينا إضافة نقطة أخرى ليصبح الـ Pattern كالتالي "^[email protected]$"، وهنا سيتم اعتماد المدخلات التالية:

[email protected]

[email protected]

[email protected]

وهلم جرا ...

هنا ستظهر بعض المشاكل:

ماذا لو أن المعرف يتكون من عشرين حرف مثلاً ؟ هل سنقوم بإضافة عشرين نقطة ؟!

في الغالب الأعم لا نستطيع تحديد عدد حروف المعرف، ففي حال وضع نقطتين كما في المثال الأخير، فإنه لن يتم اعتماد المعرفات ذات الحرف الواحد كما في المثال الذي يسبقه !

وسنعرف الحل لهذه المشاكل من خلال تعرفنا على باقي المعاملات ..

المعامل *

النجمة، ويسمح هذا المعامل بتكرار الحرف المذكور قبله لأي عدد من المرات أو حذفه نهائياً .. وتظهر نتيجة ذلك فيما لو جعلنا الـ Pattern يساوي "^A-F-R*$" مثلاُ، فإنه سيكون من الممكن تكرير الحرف R لأي عدد من المرات، كما أنه يمكننا حذفه نهائياً وستكون القيمة العائدة من التحقق True في جميع هذه الأحوال ..

هل يوحي لك هذا المعامل بشيء ما ؟

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

بديهي أننا سنقوم بإضافة معامل النجمة بعد معامل النقطة ليكون الـ Pattern كالتالي "^.*@hotmail.com$"، ولنبدأ بتجربة الكود من جديد، ونلاحظ أنه يمكننا في هذه المرة أن نستخدم أي عدد من الحروف للمعرف ( تأثير معامل النجمة )، كما أنه يمكننا استخدام حروف مختلفة ( تأثير معامل النقطة ) ..

ولكن ..

هل نكون بذلك قد تفادينا جميع الأخطاء الممكنة ؟؟

هناك خطأ كبير من الممكن أن يقع وهو ناتج عن إمكانية حذف الحرف الموجود قبل معامل النجمة، وبذلك لو أدخل المستخدم القيمة التالية @hotmail.com فإنه سيتم اعتمادها ..

لا تقلق فسنتجاوز هذه المشكلة عن طريق المعامل التالي ..

المعامل +

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

والآن في كود التحقق من معرف البريد الإلكتروني سيكون من الأنسب أن نستخدم معامل علامة الجمع بدلاً من معامل النجمة، لأنه يجب أن يكون معرف البريد الإلكتروني حرفاً واحداً على الأقل ليكون الـ Pattern كالتالي "^[email protected]$"..

ما رأيك ؟ هل انتهينا الآن ؟؟

ما زال بالإمكان ظهور الكثير من الأخطاء والمشكلات في الصيغة السابقة ..

جرب إدخال [email protected]@com وانظر ما هي النتيجة ؟!

غريبة فقد تم اعتمادها ..

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

وسنرى كيف يمكننا تجاوز هذه المشكلة من خلال المعامل التالي ..

المعامل \

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

الآن سنقوم بتغيير الـ Pattern الخاص بمعرف البريد الإلكتروني مرة أخرى ليصبح كالتالي "^[email protected]\.com$" ، النتيجة أنه لن يتم اعتماد أي حرف يتم وضعه مكان النقطة الأخيرة كما في الخطأ المذكور أعلاه ..

هل يمكن أن تظهر مشكلة أخرى ؟؟

ما زال هناك العديد من المشاكل التي من الممكن أن تظهر، وكلما كانت الصيغة أقوى كلما قل احتمال وجود الخطأ ..

عموماً .. سنذكر فيما يلي بقية المعاملات، وسأترك لكم استنتاج الصيغة الصحيحة :D ..

المعامل ؟

علامة الاستفهام، ويسمح هذا المعامل بوجود الحرف الذي قبله مرة واحدة فقط، أو حذفه نهائياً، ولذلك فإنه في حال جعل الـ Pattern يساوي "^A-F?-R$" فإنه سيتم اعتماد قيمتين فقط وهما A-F-R أو A--R وكما ترى قمنا بذكر حرف الـ F في مرة، وقمنا بحذفه في المرة الأخرى ..

المعامل {n}

ذكرنا فيما سبق معامل النجمة، ومعامل علامة الجمع، وعرفنا أنهما يسمحان بتكرار الحرف الذي يسبقهما لعدد غير محدد من المرات، مع اختلاف بسيط بينهما، ولكن ماذا لو أردنا تحديد عدد هذا التكرار ؟؟ هذا ما يتيحه لنا المعامل {n} حيث نقوم باستبدال الحرف n بالرقم الذي نريد تحديد عدد التكرار على أساسه، و ولذلك فإنه في حال جعل الـ Pattern يساوي "^A-F{3}-R$" فإنه سيتم اعتماد قيمة واحدة فقط وهي A-FFF-R ، وكما ترى لابد من تكرار الحرف F ثلاث مرات وإلا فلن يتم اعتماده .. لاحظ أنه لو استخدمنا الرقم صفر بداخل الأقواس فهذا يعني أنه يجب تكرار الحرف عدد صفر من المرات، وهذا يعني حذفه ..

المعامل {min,max}

ماذا لو أردنا بدلاً من تحديد عدد التكرار حصره داخل نطاق معين، هنا سنستخدم المعامل {min,max} على أن نقوم باستبدال الكلمة min بأقل عدد تكرار يمكن قبوله، واستبدال الكلمة max بأكثر عدد تكرار يمكن قبوله ..

في حال جعل الـ Pattern يساوي "^A-F{0,2}-R$" فإنه سيتم اعتماد ثلاث قيم فقط وهي A--R و A-F-R و A-FF-R، أرجو أن يكون السبب واضحاً ..

المعامل [letters]

يقوم بنفس وظيفة معامل النقطة حيث أنه يمكنك استبداله بأي حرف، والفرق الوحيد هو أن هذا الحرف يتم تحديده من خلال الحروف الموجودة داخل الأقواس، مثلاً المعامل [ADRQ] يعني أنه يمكن أن نستبدل هذا المعامل بواحد من الحروف A أو D أو R أو Q ونقوم بتحديد هذه الأحرف بشكل عشوائي، أي حسب الرغبة، كما أنه يمكن إدخال نطاق معين مثلاً إذا أردنا تحديد البديل بحيث يكون حرفاً من الحروف التالية A أو B أو C أو D فإنه يمكن استخدام المعامل بالشكل التالي [A-D]، كما يمكن استخدامه في حالات الأرقام مثلاً [3-6] ..

في حال وجود خيارين ( أو أكثر ) للحرف البديل نستخدم المعامل | للفصل بين الخيارات المتاحة، مثلاً إذا كان بالإمكان أن يكون البديل حرفاً من R إلى Z أو رقماً من 5 إلى 8 فإن المعامل يظهر كالتالي [R-Z|5-8]، كما يمكن إلغاء المعامل | اختيارياً ليظهر المعامل كالتالي [R-Z5-8] ..

المعامل [^letters]

وهو على النقيض من المعامل السابق تماماً، حيث أنه يحصر الحرف البديل في أي حرف غير الحرف أو الحروف الموجودة بعد المعامل ^، على سبيل المثال لو استخدمنا المعامل [^F] فإنه يعني أنه يمكننا استبدال هذا المعامل بأي حرف بشرط ألا يكون حرف الـ F، وكما هو الحال في المعامل السابق فإنه يمكن استثناء أكثر من حرف، كما أن يمكن استثناء نطاق معين من الحروف أو الأرقام ..

المعامل \t

ويمثل هذا المعامل علامة الجدولة ( الـ Tab )، أي أنه في حال جعل الـ Pattern يساوي "^A\tF\tR$" فهذا يعني أنه سيتم قبول الكلمة التالية فقط A F R، مع ملاحظة أن المسافات الفاصلة بين الأحرف هي علامات جدولة، ولن يتم قبول أي قيمة أخرى ..

المعامل \n

ويمثل هذا المعامل علامة الإدخال ( الـ Enter )

المعامل \s

ويمثل هذا المعامل علامة المسافة ( الـ Space )، أو علامة الإدخال ( الـ Enter )، أو علامة الجدولة ( الـ Tab )

تقريباً هذه هي أهم المعاملات التي يمكن استخدامها في بناء صيغة للتحقق منها ..

وبهذا نكون قد انتهينا من دراستنا لهذه المكتبة ..

ولا يفوتني أن أشكر أستاذي موفق جمال زكريا لأنه هو من علمني هذه المكتبة، ودعواتي له بالتوفيق ..

جدير بالذكر أنه يوجد مثيل لهذه المكتبة في بيئة الـ Visual Studio .Net، وهو ما سنتطرق إليه في موضوع لاحق بإذن الله تعالى ..

أتمنى أن تكونوا قد استفدتم

والسلام عليكم ورحمة الله وبركاته

تم تعديل بواسطه عبد الله فتحي
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

رووووووووعة .... ما شاء الله لا قوة الا بالله

زادك الله تعالى من علمه ونفع بك المسلمين

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكووور كتير أخي

عن جد موضوع روعة

يعطيك الف عافية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الله الله .. جزاك الله خير وكثر من أمثالك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أبدعت أخي الكريم عبد الله فتحي

موضوع أروع من رائع

وجزاك الله ألف خير عن جميع أعضاء المنتدى

وبإنتظار جديدك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته

بعدما قرأت هذا المقال أصبحت لا أصدق نفسى ( هل انا فعلا مبرمج ؟ )

انا أعمل بالفيجوال بيسيك منذ ما يقرب من ثلاث سنوات

ولم أسمع عن هذه المكتبة إلا الآن

فكم ضاع من الوقت فى تنفيذ برامجى ؟

ولكن أقول الحمد لله الذى أبصرنى بهذه المعلومات القيمة

وجزيتم خيرا .

ولكن لى سؤال حتى لا يحدث هذا مرة أخرى وأكون غافلا

عن مكتبات مثل هذه المكتبات الخطيرة وهو

كيف يتم لى معرفة المكتبات الموجودة بداخل الفيجوال بيسيك

هل هناك كتب لشرحها ؟

هل هناك أى شئ أستطيع به معرفة الكثير من المعلومات عن هذه المكتبات ؟

أرجوا الإفادة

وشكرا لحسن شرحكم ووفقكم الله لما فيه الخير :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
السلام عليكم ورحمة الله وبركاته

بعدما قرأت هذا المقال  أصبحت لا أصدق نفسى ( هل انا فعلا مبرمج ؟ )

انا أعمل بالفيجوال بيسيك منذ ما يقرب من ثلاث سنوات

ولم أسمع عن هذه المكتبة إلا الآن

فكم ضاع من الوقت فى تنفيذ برامجى ؟

ولكن أقول الحمد لله الذى أبصرنى بهذه المعلومات القيمة

وجزيتم خيرا .

ولكن لى سؤال حتى لا يحدث هذا مرة أخرى وأكون غافلا

عن مكتبات مثل هذه المكتبات الخطيرة وهو

كيف يتم لى معرفة المكتبات الموجودة بداخل الفيجوال بيسيك

هل هناك كتب لشرحها ؟

هل هناك أى شئ أستطيع به معرفة الكثير من المعلومات عن هذه المكتبات ؟

أرجوا الإفادة

وشكرا لحسن شرحكم ووفقكم الله لما فيه الخير  :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الاخ عبد الله فتحي

شكرا جزيلا علي الموضوع

ولكن لدي بعض الاستفسارات

مثلا

كيف يمكنني ان اجعل برنامجي لا يقبل قيمة فارغة في مربع النص عند عملية الحفظ

وذلك بأن يتم التحقق من جميع المدخلات واذا كان هناك TEXT فارغ او اثنين تظهر رسالة للمستخدم

بأنه يجب وضع قيمة هنا

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .