الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التحقق من السلاسل النصية والأرقام والتواريخ

مغلق
بدأه محمد سامر أبو سلو في 25 أكتوبر 2006 · 16 رد · 2,234 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

يمكننا استخدام نموذج بحث كنموذج تحقق وذلك بتضمينه ضمن الرموز ^ و $ واستخدام الطريقة IsMatch بدلا من الطريقة Matches فمثلا يتحقق الكود التالي من أن النص يحتوي على خمسة أرقام تمثل رمز منطقة في أمريكا

pattern = "^\d{5}$"
If Regex.IsMatch(Text, pattern) Then
	' It's a string containing five digits.
End If

وهنا ستصبح الأمور أكثر إثارة عندما تريد استبعاد بعض التراكيب من مجموعة النصوص الصحيحة الشئ الذي يمكنك فعله بواسطة التركيب (?!) فعلى سبيل المثال التسلسل 00000 لا يعتبر رمز منطقة صالح حيث يمكنك استبعاده كالتالي

pattern = "^(?!00000)\d{5}$"

يمكنك استخدام تراكيب النظر مقدما (?=) للتأكد من أن نص الإدخال يحتوي على جميع المحارف ضمن فئة معطاة بغض النظر عن مكانها فمثلا يمكنك استخدام التركيب التالي لفرض سياسة كلمة سر قوية والتأكد من أن مستخدم البرنامج يقوم بإدخال ثمانية محارف كحد أدنى وأنها تحتوي على أرقام وحروف كبيرة وصغيرة

pattern = "^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])\w{8,}$"

دعنا نرى كيف يعمل هذا التركيب. الشرط الأول (?=.*\d) يجعل البحث يفشل منذ البداية إذا كان جزء النص على يمينه لا يحتوي على أرقام والتركيب (?=.*[a-z]) يتأكد أن النص المدخل يحتوي على حروف صغيرة وبالمثل التركيب (?=.*[A-Z]) يتأكد من احتواء النص على حروف كبيرة. وتراكيب النظر للأمام هذه لا تستهلك أية محارف وبهذا يتأكد التركيب \w{8,} المتبقي من أن النص يحتوي على ثمانية محارف كحد أدنى

ويظهر في التحقق من رقم في مجال معطى مشاكل مثيرة وبشكل عام قد تريد استخدام التعابير النظامية للتحقق من الأرقام والتواريخ لأن النوع DateTime يزودك بالطرق Parse و Try-Parse وكذلك جميع الأنواع الرقمية أيضا مما يوفر مرونة أكثر ومع ذلك في بعض الحالات تكون التعابير النظامية قابلة للتطبيق حتى في هذه المهمة فمثلا قد تريد استخراج الأرقام والتواريخ الصحيحة من وثيقة أطول والتأكد من أن العدد الصحيح Integer يملك قيمة حتى حد معين تعتبر مشكلة عادية بالطبع

' Validate an integer in the range of 0 to 9,999; accept leading zeros.
pattern = "^\d{1,4}$"

تركيب النظر للأمام (?!) السلبي يجعلك تتحكم بعدة حالات

' Validate an integer in the range 1 to 9,999; reject leading zeros.
pattern = "^(?!0)\d{1,4}$"
…
' Validate an integer in the range 0 to 9,999; reject leading zeros.
' (Same as previous one, but accept a single zero as a special case.)
pattern = "^(0|(?!0)\d{1,4})$"
…

إذا كان الحد الأدنى للمجال المقبول ليس بالصيغة 99…999 تبقى لديك إمكانية استعمال التعابير النظامية لعمل التحقق ولكن التركيب يصبح أكثر تعقيدا فمثلا يتحقق التركيب التالي من أن الرقم ضمن المجال من 0 إلى 255 بدون أصفار سابقة

pattern = "^(25[0–5]|2[0–4]\d|1\d\d|[1–9]\d|\d)$"

التركيب 25[0-5] يتحقق من الأرقام في المجال من 250 إلى 255 والتركيب 2[0-4]\d يتحقق من الأرقام ضمن المجال من 200 إلى 249 والتركيب 1\d\d يتحقق من الأرقام ضمن المجال من 100 إلى 199 والتركيب [1-9]\d يهتم بالأرقام من 10 إلى 99 وأخيرا التركيب \d يغطي المجال من 0 إلى 9 وبتعديل بسيط على التركيب يمكنك التحقق من رقم IP مكون ون أربعة أقسام مثل 192.168.0.11

pattern = "^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}" _
   & "(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$"

وتصبح الأمور أكثر تعقيد بسرعة ضمن المجالات الأكبر

' Validate an integer number in the range 0 to 65,535; leading zeros are OK.
pattern = "^([1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-4]|\d{1,4})$"

وقد يكون للأرقام إشارة تسبقها تحتاج لمعالجة خاصة

' Validate an integer in the range -32,768 to 32,767; leading zeros are OK.
pattern = "^(-?[12]\d{4}|-?3[0-1]\d{3}|-?32[0-6]\d{2}|-?327[0-5]\d|" _
   & "-?3276[0-7]|-32768|-?\d{1,4})$"

لاحظ في التركيب السابق أن الحالة الخاصة -3278 يجب التعامل معها بشكل مستقل وكل التركيب الباقي يملك إشارة ناقص اختيارية سابقة ويمكنك استخدام تقنية شبيهة للتحقق من قيمة وقت

' Validate a time value in the format hh:mm; the hour number can have a leading zero.
pattern = "^(2[0–3]|[01]\d|\d):[0–5]\d$"

والتحقق من قيم التاريخ قد تكون أكثر صعوبة بسبب احتواء كل شهر على عدد مختلف من الأيام وفوق كل ذلك يعتمد اليوم الصحيح في شهر شباط على كون السنة كبيسة أم لا وقبل تقديم حل لهذه المشكلة دعنا نرى كيف يمكن للتعابير النظامين التحقق من أن أي رقم معطى ذو خانتين يقبل القسمة على 4

' If the first digit is even, the second digit must be 0, 4, or 8.
' If the first digit is odd, the second digit must be 2 or 6.
pattern = "^([02468][048]|[13579][26])$"

وباستخدام افتراض مبسط بأن رقم السنة ذو خانتين فقط فسيكون بالتالي التاريخ المعطى في القرن الحالي مما سيمكننا من تبسيط التعبير النظامي بشكل واضح لأن السنة 2000 كبيسة بعكس السنة 1900 و 2100 ولتوضيح التعبير النهائي قسم التركيب إلى أربعة سطور

' This portion deals with months with 31 days.
Dim p1 As String = "(0?[13578]|10|12)/(3[01]|[012]\d|\d)/\d{2}"
' This portion deals with months with 30 days.
Dim p2 As String = "(0?[469]|11)/(30|[012]\d|\d)/\d{2}"
' This portion deals with February 29 in leap years.
Dim p3 As String = "(0?2)/29/([02468][048]|[13579][26])"
' This portion deals with other days in February.
Dim p4 As String = "(0?2)/(2[0-8]|[01]\d|\d)/\d{2}"
' Put all the patterns together.
pattern = String.Format("^({0}|{1}|{2}|{3})$", p1, p2, p3, p4)
' Check the date.
If Regex.IsMatch(Text, pattern) Then
	 ' Date is valid.
End If

وإن كان رقم السنة ذو خانتين أو أربع خانات وجب علينا الأخذ بعين الاعتبار أنه ليست جميع السنوات القابلة للقسمة على 100 كبيسة إلا إن كانت قابلة للقسمة على 400 مما يجعل التركيب النظامي أكثر تعقيدا ولكن الآن أصبحت لديك الخبرة الكافية لفهم كيف يعمل الكود التالي

' This portion deals with months with 31 days.
Const s1 As String = "(0?[13578]|10|12)/(3[01]|[12]\d|0?[1–9])/(\d\d)?\d\d"
' This portion deals with months with 30 days.
Const s2 As String = "(0?[469]|11)/(30|[12]\d|0?[1-9])/(\d\d)?\d\d "
' This portion deals with days 1–28 in February in all years.
Const s3 As String = "(0?2)/(2[0–8]|[01]\d|0?[1–9])/(\d\d)?\d\d"
' This portion deals with February 29 in years divisible by 400.
Const s4 As String = "(0?2)/29/(1600|2000|2400|2800|00)"
' This portion deals with February 29 in noncentury leap years.
Const s5 As String = "(0?2)/29/(\d\d)?(0[48]|[2468][048]|[13579][26])"
' Put all the patterns together.
pattern = String.Format("^({0}|{1}|{2}|{3}|{4})$", s1, s2, s3, s4, s5)

وسيكون من السهل عمل تعبير نظامي للتواريخ من الشكل dd/mm/yy وذلك بالأخذ بعين الاعتبار اختلاف الحرف الفاصل بين أقسام التاريخ.

مترجم للفائدة

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

السلام عليكم :

شكراً لك أستاذنا المشرف .. حقاً درس رائع .. :)

أتمنى التفاعل أكثر من بقية الأعضاء .. <_<

أخوكم أبو عمر .

#3

أكثر من رائع أخي samerselo .

والله يكثر من أمثالك .. ويكثر من هذه الدروس .

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#4

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

أولاً كلنا نشكرك على هذا الجهد الواضح في نشر الدروس و العلم في منتدى مبرمجي فيجوال بيسك دوت نت .. :)

ثانياً : سأذكر بدلاً منك أخي سامر (طبعاً إذا سمحت لي ) بوجوب تضمين الفضاء المطلوب

للتحقق من السلاسل النصية والأرقام والتواريخ :

Imports System.Text.RegularExpressions

ثانياً : أريد أن أثقل عليك و أطلب خدمة إن تكرمت :) وهي أن تفصل أكثر في الشرح ..

وخاصة في استخدام بعض المحارف مثلاً : / \ ? $ الأقواس () {} <> ...إلخ

--

وأطلب منك إذا تكرمت الطلب الشخصي التالي :

إذا بدي عالج الوقت من النوع القصير مثلاً (12:20) ..

ما هي صيغة الـ Pattern في الدالة IsMatch ..؟؟

ممكن مثال صغير إذا سمحت ؟ :)

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#5
imadouzoun كتب:
السلام عليكم ورحمة الله وبركاته :

أولاً كلنا نشكرك على هذا الجهد الواضح في نشر الدروس و العلم في منتدى مبرمجي فيجوال بيسك دوت نت .. :)

ثانياً : سأذكر بدلاً منك أخي سامر (طبعاً إذا سمحت لي ) بوجوب تضمين الفضاء المطلوب

للتحقق من السلاسل النصية والأرقام والتواريخ :

Imports System.Text.RegularExpressions

ثانياً : أريد أن أثقل عليك و أطلب خدمة إن تكرمت :) وهي أن تفصل أكثر في الشرح ..

وخاصة في استخدام بعض المحارف مثلاً : / \ ? $ الأقواس () {} <> ...إلخ

--

وأطلب منك إذا تكرمت الطلب الشخصي التالي :

إذا بدي عالج الوقت من النوع القصير مثلاً (12:20) ..

ما هي صيغة الـ Pattern في الدالة IsMatch ..؟؟

ممكن مثال صغير إذا سمحت ؟ :)

بالسنبة لمعالجة الوقت كما طلبت موجود في المقالة

pattern = "^(2[0–3]|[01]\d|\d):[0–5]\d$"

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

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

شكراً لك :)

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#7

مرفق ملف يحتوي بعض التعابير النظامية الجاهزة للاستخدام

CommonRegularExpressions.zip

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#8

هذه بعض الامثلة

التحقق من أن عنوان الانترنيت عنوان صالح

Dim blnMatch As Boolean, strValue As String = "www.arabteam2000-forum.com"
		blnMatch = System.Text.RegularExpressions.Regex.IsMatch( _
		strValue, "^[a-zA-Z0-9]+([a-zA-Z0-9\-\.]+)?\.(com|org|net|mil|edu|info)$", _
		   System.Text.RegularExpressions.RegexOptions.IgnoreCase)
		MsgBox(blnMatch)

تفحص إذا كان النص المدخل عنوان IP صالح

Dim blnMatch As Boolean, strValue As String = "127.0.0.1"
		blnMatch = System.Text.RegularExpressions.Regex.IsMatch(strValue, _
		  "^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\." & _
		  "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\." & _
		  "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\." & _
		  "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$")
		MsgBox(blnMatch)

تفحص إذا كان الرقم المدخل رقم بطاقة إئتمانية صالح

Dim blnMatch As Boolean, strValue As String = "5440206023965209"
		blnMatch = System.Text.RegularExpressions.Regex.IsMatch(strValue, _
			"^((?:4\d{3})|(?:5[1-5]\d{2})|(?:6011)|" & _
			"(?:3[68]\d{2})|(?:30[012345]\d))[ -]?(\d{4})" & _
			"[ -]?(\d{4})[ -]?(\d{4}|3[4,7]\d{13})$")
		MsgBox(blnMatch)

تفحص النص المدخل إذا كان ISBN صالح

Dim blnMatch As Boolean, strValue As String = "159059021X"
		blnMatch = System.Text.RegularExpressions.Regex.IsMatch(strValue, _
		   "^\d{9}[\d|X]$")
		MsgBox(blnMatch)

تفحص إذا كان النص المدخل GUID صالح

Dim strValue As String = "87374201-1CB6-46A2-AEAB-C0F2F8ABA75D"
		Dim blnMatch As Boolean
		blnMatch = System.Text.RegularExpressions.Regex.IsMatch(strValue, _
		   "^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$", _
		   System.Text.RegularExpressions.RegexOptions.IgnoreCase)
		MsgBox(blnMatch)
#9

والله الموضوع حلو ( لكن معقد )

اللهم اغفر لي و لوالدي و للمؤمنين يوم يقوم الحساب

لا إله إلا الله عدد ما كان و عدد ما يكون و عدد الحركات و السكون

#10

هل يعني باستخدام هذه الصيغ

نستطيع التحقق من أي شيئ مهما كان نريد بعد أن يدخله المستخدم؟؟

lxcs.png

syria-flag_small.jpg

#11
SalehRam كتب:
هل يعني باستخدام هذه الصيغ

نستطيع التحقق من أي شيئ مهما كان نريد بعد أن يدخله المستخدم؟؟

أي نعم و إذا بدك الحدث Validating الو علاقة بالموضوع كمان

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#12

هل من الممكن ارفاق مثال لطريقة التحقق من التاريخ المدخل فى شكل dd/mm/yyyy

وجزاكم الله كل خير ، موضوع شيق بالفعل

#13
H.Saber كتب:
هل من الممكن ارفاق مثال لطريقة التحقق من التاريخ المدخل فى شكل dd/mm/yyyy

وجزاكم الله كل خير ، موضوع شيق بالفعل

تم شرح كيفية التحقق من التاريخ بالتفصيل في المقالة

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#14

ما اقصده هو كيفية استخدامها مع TextBox للتحقق من التاريخ اى كيفية استدعائها لتقوم بعملها.

وشكرا جزيلا لك اخى محمد سامر

#15

نستخدم الكود في الحدث Validating لـ TextBox

مثلا

pattern = "التعبير النظامي الذي تريده مهما كان"
If Regex.IsMatch(Text, pattern) Then
	' مطابق نفذ ما تريد
else
   ' غير مطابق نفذ ما تريد
   e.cancel=true
End If

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#16

شكراً أستادنا الغالي .. محمد سامر أبو سلو ..

حقيقة .. موضوع في غاية الأهمية . طالما قرأت عنه ولم أجد جواب شافي ..

شكراً لك مرة أخرى ..

#17

لك جزيل الشكر اخى محمد سامر

هذا الموضوع مغلق.

مواضيع مشابهة