اشترك في مجموعة montadaphp.net حتى تصلك أخبار المنتدى  

بريدك الإلكتروني:

النتائج 1 إلى 10 من 10
شجرة الإعجاب7إعجاب
  • 3 Post By
  • 1 Post By
  • 1 Post By asmti
  • 2 Post By

الموضوع: التعابير القياسية بكل احترافية

  1. #1
    عضو شرف الصورة الرمزية ملك الأرقام
    تاريخ التسجيل
    07-08-2009
    السن
    22
    المشاركات
    1,576
    معدل تقييم المستوى
    9

    افتراضي التعابير القياسية بكل احترافية

    مقدمة:
    التعابير القياسية (regular expressions (regex هو نمط يصف شكل النص المراد البحث عنه
    فمثلاً انت تريد البحث عن جميع الكلمات التي تبدأ بحرف A هذا شكل ، أو الكلمات التي تنتهي بحرف e وهكذا ..
    وأهم الدوال التي لها علاقة بالتعابير القياسية هي:
    1- preg_match للبحث عن شكل معين داخل نص معين
    2- preg_quote تعطيل وظائف الرموز التي لها وظيفة في التعابير القياسية بإضافة سلاش قبلها
    3- preg_replace استبدال شكل معين من نص بنص آخر
    ولكن ليس موضوعنا الآن دراسة الدوال بل دراسة التعابير القياسية التي تستخدمها هذه الدوال
    والآن لنبدأ تعلم التعابير القياسية

    الرموز الحرفية Literal Characters:
    الرموز الحرفية هي هي رموز ليس لها وظيفة داخل التعابير القياسية مثال الحرف a أو h
    مثال:
    كود PHP:
    $string "regular expression";
    $new_text preg_replace("e","|REPLACED|",$string);
    echo 
    $new_text
    هذا المثال يبحث عن الحرف e داخل المتغير string ويستبدله بـ |REPLACED| فتكون النتيجة:
    r|REPLACED|gular |REPLACED|xpr|REPLACED|ssion
    أترون في هذا المثال تم البحث عن الحرف e واستبداله إذا الرمز e داخل التعابير القياسية لا يقوم بوظيفة معين وإنما فقط يمثل نفسه في البحث إذاً فالحرف e هو رمز حرفي


    طبقات الرموز Character Classes:
    طبقات الرموز تبحث عن واحد فقط من رموز متعدد وتوضع هذه الرموز المراد البحث عن أحدها ضمن قوسين "[ ]"
    مثال:
    كود PHP:
    $string "see";
    $new_text preg_replace("se[ea]","|REPLACED|",$string);
    echo 
    $new_text
    هذا المثال سوف يبحث عن كلمة مؤلفة من se ثم أحد الحرفين a أو e يعني احد الكلمتين sea أو see
    هناك بعض الرموز التقوم تقوم بمهام داخل طبقة الرموز
    منها
    1- الشخطة dash " - ":
    ومهمتها اعطاء مجال لتشمل جميع الحروف بين حرفين مثال:
    [a-z] كل الحروف من a إلى z
    [a-zA-Z] كل الحروف من a إلى z كبير capital أو صغيرة small
    [0-9] الأرقام
    كود PHP:
    $string "123x45";
    $new_text preg_replace("[a-z]","|REPLACED|",$string);
    echo 
    $new_text
    النتيجة:
    123|REPLACED|45
    2-الرمز "^":
    ويوضع مباشرة بعد ] ليشير إلى عكس المطلوب البحث عنه مثال
    [a-z^] يبحث عن أي رمز غير الحروف


    النقطة Dot Character:
    النقطة " . " مهمتها البحث عن رمز معين واحد مهما كان
    مثال:
    كود PHP:
    $string "will well wll wgll";
    $new_text preg_replace("w.ll","|REPLACED|",$string);
    echo 
    $new_text
    النتيجة :
    |REPLACED| |REPLACED| wll |REPLACED|

    ملاحظة: لم يتم استبدال wll لأنه لا يوجد رمز يمثل النقطة

    المثبِتات Anchors:
    هي رموز تقوم بمهمة معينة داخل التعابيير القياسية ولكنها لا تقوم بالبحث عن رمز معين أبداً ومنها
    1- الرمز "^" caret:
    ويوضع في بداية نمط البحث ويشير إلى البحث في بداية النص فقط مثال:
    [a-z]^ تبحث عن أي نص يبدأ بحرف مثلاً king ولا يبحث عن 6king

    2- رمز الدولار "$":
    ويوضع في نهاية نمط البحث ويشير الى البحث في نهاية النص فقط مثال:
    $[a-z] يبحث عن أي كلمة تنتهي بحرف

    $[a-z]^ تبحث عن أي نص يبدأ وينتهي بنفس الحرف مثال النص d ولكن لا يبحث عن aza


    الرمز " | " Alternation:
    يعمل عمل الكلمة "أو or"
    مثال
    a|e الحرف a أو e



    التكرار Repetition:
    التكرار هو أحد المهامة المهمة في التعابير القياسية وهو يقوم بتكرار رمز معين ومن أدواته:

    1- رمز اشارة الاستفهام question mark "?":
    وهي تعني بأن يسمح بوجود الرمز الذي يسبق ? مرة أو ولا مرة مثال:
    كود PHP:
    $string "color colour colouur";
    $new_text preg_replace("colou?r","|REPLACED|",$string);
    echo 
    $new_text
    النتيجة:
    |REPLACED| |REPLACED| colouur
    قام باستبدال colour لوجود u مرة وأيضاً باستبدال color لعدم وجود U ولكن لم يستبدل colouur لوجودها مرتين

    2- رمز النجمة asterisk "*":
    مهمة النجمة بان تسمح بتكرار الرمز الذي يسبق النجمة أي عدد من المرات وتسمح أيضاً بعدم وجوده
    مثال:
    كود PHP:
    $string "kingofnumbers";
    $new_text preg_replace("^[a-zA-Z0-9]*$","|REPLACED|",$string);
    echo 
    $new_text
    في هذا المثال يستبدل النص المؤلف من حروف وأرقام من الأول للأخير
    والنتيجة:|REPLACED|

    3- رمز الزائد plus "+":
    يسمح بتكرار الرمز الذي يسبق الزائد أي عدد من المرات ولكن لا يسمح بعدم وجوده

    4- الأقواس المعقوفة curly braces "{ }":
    وفائدتها لتحديد عدد مرات التكرار بالضبط أو ترك مجال مثال:
    {a{3 يكرر الحرف a ثلاث مرات
    {a{3,5 يكرر الحرف a ثلاث إلى خمس مرات
    {,a{3 يكرر الحرف a ثلاث أو أكثر من المرات

    التكرارات الطويلة والقصيرة Greedy and Lazy Repetition:
    تتمير التكرارات في التعابير القياسية بأنها طويلة فالنمط التكراري يحاول أن يناظر أكبر كمية من النص
    مثال لاستبدال وسوم html:
    كود PHP:
    $string "hi , <em>my</em> friends";
    $new_text preg_replace("<.+>","|REPLACED|",$string);
    echo 
    $new_text
    حسنا هذا النمط
    كود PHP:
     <.+> 
    يدل على شكل وسم html إذاً فيجب أن يستبدل كل وسم html بكلمة |REPLACED| ولكن انظروا للنتيجة:
    hi , |REPLACED| friends
    والسؤال هو لماذا استبدل وسم الفتح والاغلاق والنص بينهما مع انه يجب أن يستبدل مرة وسم الفتح ومرة الاغلاق بدون أن يستبدل النص بينهما
    الجواب:
    إن النمط المدخل هو: <.+> إذا هو أولاً سوف يبحث عن > ثم عن النص (.+) ثم عن < ويستبدلها وعندما بدأ البحث وجد الرمز > بتاع وسم الفتح ثم بدأ بأخذ النص داخل وسم الفتح وهو em والآن ها هو قد وجد الرمز < ولكنه اعتبرها جزءً من النص الممثل بالنمط (.+) وهكذا حتى وصل إلى الرمز < بتاع وسم الاغلاق واعتبرها هي نهاية النمط
    أي استبدل مرة واحدة هذا<em>my</em> اعتبر النص هو em>my</em وهذا هو معنى أن يحاول مناظرة أكبر كمية من النص
    ولجعله قصيراً وحل هذه المشكلة يكفي استعمال اشارة الاستفهام Question mark بعد الرمز التكراري + أو * أو ? أو { }
    مثال:
    كود PHP:
    $string "hi , <em>my</em> friends";
    $new_text preg_replace("<.+?>","|REPLACED|",$string);
    echo 
    $new_text
    النتيجة
    hi , |REPLACED|my|REPLACED| friends
    ملاحظة: هناك فرق بين اشارة الاستفهام التي تأتي بعد رمز التكرار والتي تأتي بعد أي رمز آخر وهناك نوع آخر لاشارة الاستفهام وهي التي تأتي بعد القوس ")" ولها مهام ندرسها لاحقاً

    المجموعات والمراجع Grouping and Backreferences:
    المجموعة هي الرموز التي ما بين أقواس "( )" لجمعهم مع بعضهم مثال
    ?(set(Value
    فهي تستبدل set أو setValue
    فاشارة الاستفهام شملت كلمة Value ولم تشمل رمزاً واحداً.
    تمتاز المجموعة بأنها تقوم بإضافة مرجع Backreference يقوم بتخرين القيمة التي ناظرت المجموعة ففي المثال السابق
    ?(set(Value
    إذا كان المستبدل set لن يحتوي المرجع أي قيمة أما إذا كان المستبدل setValue لاحتوى المرجع قيمة Value
    مثال آخر
    ?*.(.)^
    النقطة داخل القوسين هي تدل على أول حرف لذى المرجع بتاع المجموعة سوف يكون أول حرف من المستبدل

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

    والمراجع هي لها ترقيم يبدأ من الواحد ورقم كل مرجع يمثال رقم المجموعة ويتم اخراج المرجع عن طريق باك سلاش "\" ثم رقم المرجع مثلاً 2\

    لنأخذ مثالاً نريد فيه التقاط النص بين قوسي اقتباس مفردة (') أو مزدوجة (") يكون بالنمط التالي:
    كود PHP:
    ('|").*?('|") 
    لنبحث عن هذا النمط داخل النص:
    كود PHP:
    he said:"it's Good" 
    والنتيجة سوف يعثر هذا النمط على
    "it'

    وهذا شي طبيعي لأننا لم نقل أنه يجب أن يكونا علامتي الاقتباس متماثلة والحل هو باستخدام المراجع
    بما أن المجموعة الأولى إما ان تكون ' أو " لذلك المرجع بتاعها إما أن يكون قيمته " او '
    ولاستخدام المرجع نستعمل هكذا:
    كود PHP:
    (\1).*?('|") 
    والنتيجة استبدال :
    "it's Good"

    البحث حول lookaround:
    من احدى خواص regular expession هي البحث حول وهي مثلاً أنك تريد أن تبحث عن حرف a ولكن فقط إذا كان بعده حرف r ولكن دون ان تكون r ضمن مجال البحث أو الاستبدال
    وله أربع أشكال:
    1- النظر إلى الأمام الإيجابي postive lookahead:
    ويكون شكلها العام هكذا:
    كود PHP:
     (?=(text)) 
    مثال
    كود PHP:
    a(?=r
    البحث عن a التي فقط بعدها r
    2- النظر الى الأمام السلبي negative lookahead:
    شكله
    كود PHP:
    (?!(text)) 
    3- النظر إلى الخلف الإيجابي postive lookbehind:
    كود PHP:
    (?<=(text)) 
    4- النظر إلى الخلف السلبي negative lookbehind:
    كود PHP:
    (?<!(text)) 
    تعليموه, Mr.HELMY و gfxgalaxyمعجب بهذا .

  2. #2
    عضو شرف الصورة الرمزية ملك الأرقام
    تاريخ التسجيل
    07-08-2009
    السن
    22
    المشاركات
    1,576
    معدل تقييم المستوى
    9

    افتراضي رد: التعابير القياسية بكل احترافية

    المجموعة الذرية Atomic group:
    المجموعة الذرية تشبة المجموعة العادية ولكنها تبحث عن أول مناظر له ثم تأخذه ولا تبحث عن المناظر الأفضل وشكله كالتالي:
    كود PHP:
    (?>partten) 
    مثال:
    ليكن لدينا النمط التالي:
    كود PHP:
    a(bc|b)
    هذا النمط يناظر abc أو abcc
    ولكن
    كود PHP:
    a(?>bc|b)c 
    لا يناظر abc ولكن فقط abcc
    لماذا؟
    لننظر إلى آليه العمل
    أولاً a تناظر a ثم تدخل إلى المجموعة الذرية تجرب bc هل هي موجودة؟ نعم موجودة
    ولكن بقيت حرف c لا يوجد مناظر له بالتالي فشلت
    ولو كانت مجموعة عادية لكان عاد إلى الوراء ثم جرب الاحتمال الثاني وهو b ثم عثر c

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


    اعداد وترجمة من المصدر: http://regular-expressions.info
    Mr.HELMY معجب بهذا .

  3. #3
    عضو فعال الصورة الرمزية bishoe
    تاريخ التسجيل
    19-08-2009
    المشاركات
    385
    معدل تقييم المستوى
    8

    افتراضي رد: التعابير القياسية بكل احترافية

    شكرا على الشرح
    بس لالاسسف مش قادر افهمها وايه فايدتها مش عارف بس بشوف كل الناس بتنصح بيها

  4. #4
    عضو جديد
    تاريخ التسجيل
    11-05-2012
    المشاركات
    2
    معدل تقييم المستوى
    0

    Thumbs up رد: التعابير القياسية بكل احترافية

    عمل رائع وجهد كبير جزيت خيرا ...
    الملاحظة لم تضع محددات
    ملاحظة عن المحددات (Delimiters )
    توضع عند بداية ونهاية الباترن مثل %
    se[ea]%
    يمكن ان يكون اي شئ غير حروف الافابتك وغير / و المساحة space
    عادة ما تستخدم / أو % أو علامة ~
    امثلة
    كود PHP:
      /foo bar/
    #^[^0-9]$#
    +php+
    %[
    a-zA-Z0-9_-]% 

    التعديل الأخير تم بواسطة asmti ; 12-05-2012 الساعة 11:52 PM
    Mr.HELMY معجب بهذا .

  5. #5
    عضو جديد
    تاريخ التسجيل
    04-06-2012
    المشاركات
    9
    معدل تقييم المستوى
    0

    افتراضي رد: التعابير القياسية بكل احترافية

    والله لو ضليت 100 سنة احاول اتعلم الريجيكس , بعمري مارح اعرف اتعلمها ,, مافي شيء صعب علي بالبي اتش بي سوا الريجيكس

    شكراً يالغالي ,

  6. #6
    Webmaster
    "رب زدني علما"
    الصورة الرمزية يوسف الحمود
    تاريخ التسجيل
    24-12-2006
    المشاركات
    4,961
    معدل تقييم المستوى
    10

    افتراضي رد: التعابير القياسية بكل احترافية

    اقتباس المشاركة الأصلية كتبت بواسطة فراس درويش مشاهدة المشاركة
    والله لو ضليت 100 سنة احاول اتعلم الريجيكس , بعمري مارح اعرف اتعلمها ,, مافي شيء صعب علي بالبي اتش بي سوا الريجيكس

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


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

    قوانين منتدى بي اتش بي

    Regulations Montada PHP




  7. #7
    عضو شرف الصورة الرمزية ملك الأرقام
    تاريخ التسجيل
    07-08-2009
    السن
    22
    المشاركات
    1,576
    معدل تقييم المستوى
    9

    افتراضي رد: التعابير القياسية بكل احترافية

    مع اني حاولت اشرحها بطرق مبسطة جداً
    على كل أحوال يمكنك الاستعانة بالتجربة .. فهي خير وسيلة لكي تفهم

  8. #8
    Webmaster
    "رب زدني علما"
    الصورة الرمزية يوسف الحمود
    تاريخ التسجيل
    24-12-2006
    المشاركات
    4,961
    معدل تقييم المستوى
    10

    افتراضي رد: التعابير القياسية بكل احترافية

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

  9. #9
    عضو مشارك
    تاريخ التسجيل
    20-11-2012
    المشاركات
    13
    معدل تقييم المستوى
    0

    افتراضي رد: التعابير القياسية بكل احترافية

    اخى الكريم وانا اقرا الدرس واطبق اللى اتعلمه وكلى نشاط ... قمت بتجربه الكود التالى
    $string = "regular expression";
    $new_text = preg_replace("e","|REPLACED|",$string);
    echo
    $new_text;
    لم يعمل معى وظهرت لى الرسالة التالية
    Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\learn\regular.php on line 5
    ومن تجربتى لم يعمل معى الا بالطريقة هذه اخى الكريم وهذا الكود الذى عمل معى بلا خطأ
    regular.jpg

    حيث وضعت ما يتم استبداله بين ( ) ... وكانت النتيجه

    regular2.jpg

    واشتغلت تمام ... ليش السبب لا تشتغل بالطريقه العادية مثل الكود اللى بالشرح

    ومشكور اخى وجارى التطبيق على الباقى .. بارك الله فيك

  10. #10
    عضو مشارك
    تاريخ التسجيل
    01-06-2009
    المشاركات
    27
    معدل تقييم المستوى
    0

    افتراضي رد: التعابير القياسية بكل احترافية

    رائع جدا أخي الكريم
    هذه تحل العديد من المشاكل في التعامل مع النصوص
    سابقا كان الأمر صعبا - الآن و بهذه الطريقة ياسلاام يمكنك عمل العجب العجاب

معلومات الموضوع

الأعضاء الذين يشاهدون هذا الموضوع

الذين يشاهدون الموضوع الآن: 1 (0 من الأعضاء و 1 زائر)

المواضيع المتشابهه

  1. كيفية عمل سلايد شو احترافية
    بواسطة Bahad في المنتدى مشاكل وحلول PHP Errors & Troubleshooting
    مشاركات: 4
    آخر مشاركة: 02-03-2011, 04:59 AM
  2. استفسار محتاج مساعده في preg-replace و التعابير القياسية
    بواسطة 25kuwait في المنتدى مشاكل وحلول PHP Errors & Troubleshooting
    مشاركات: 2
    آخر مشاركة: 02-11-2010, 09:07 PM
  3. مشكلة سؤال في التعابير القياسية .. أرجو الرد
    بواسطة صـد في المنتدى مشاكل وحلول PHP Errors & Troubleshooting
    مشاركات: 6
    آخر مشاركة: 21-04-2010, 09:27 AM
  4. شرح regular expression - التعابير القياسية
    بواسطة M.M.F في المنتدى دروس بي اتش بي PHP Lessons
    مشاركات: 4
    آخر مشاركة: 12-04-2010, 01:28 PM
  5. استفسار سؤال في التعابير القياسية
    بواسطة Scare في المنتدى مشاكل وحلول PHP Errors & Troubleshooting
    مشاركات: 0
    آخر مشاركة: 23-09-2008, 04:58 AM

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •