الكلمة هي تسلسل من الأحرف/الرموز يفصل بينها وبين كلمة أخرى (تسلسل آخر) فاصل ما،هذا الفاصل يتم احتسابه بناءً على قاعدة وهي:
[quoteit]حدود الكلمة هي الموضع بين كل ما هو حرف/رمز يمكن مطابقته باستخدام \w وأي شيء ليس حرف/رمز أي يمكن مطابقته مع \W
.[/quoteit]
وبالتالي من وجهة نظر التعبيرات المنتظمة ، أي تسلسل لواحد أو أكثر من الأحرف الأبجدية الرقمية – بما في ذلك الأحرف من A إلى Z والأحرف الكبيرة والصغيرة وأية رقم والشرطة السفلية Underscore (أي كل ما يطابق \w ) – هي كلمة. لذا يمكن أن يكون الحد الفاصل للكلمة عبارة عن فراغ ، أو شرطة ، أو نقطة أو علامة تعجب ، أو بداية أو نهاية السطر (أي كلا ما ينطبق عليه الفئة الملغية \W ). فمثلا الجملة Upside-down تفهمها التعبيرات المنتظمة على أنها كلمتان يفصل بنهما المحدد الشرطة لأنها ليست ضمن الفئة [A-Za-z0-9_] .
لنتصور أننا نريد تغيير الكلمة hi في الجملة التالية إلى hello
hi, Mohammad, Ahmed invites us to his home for dinnerفمن الطبيعي أن أقوم بتطبيق الكود التالي
<?php $x = 'hi, Mohammad, Ahmed invites us to his home for dinner'; echo preg_replace("/hi/", "hello",$x); ?>تكون النتيجة هي
hello, Mohammad, Ahmed invites us to hellos home for dinnerلاحظ تم تغيير كل ما هو hi حتى كلمة his التي أصبحت hellos، وهذا لأننا لم نقم بعمل حدود للكلمة المراد البحث عنها، وهنا يمكننا تعريف حدود الكلمة على أنها تشير إلى بداية أونهاية الكلمة.
والرمز المسؤل عن تحديد حدود الكلمة هو \b ، وهو أحد الإرتكازات Regex anchors ولا تنس أن حالة الحرف تفرق في التعبير، حيث \b تختلف عن \B .
وبالتالي في المثال السابق نريد أن نخبر محرك البحث أن حدود نهاية الكلمة هي i، بحيث إذا وجد الكلمة hi يفصل بينها وبين ما يليها أي من حدود الكلمات (مثل شرطة أو نقط أو أي ما ليس \w ) يقوم باستبدالها، أو لا يفعل شيء إن لم يتحقق الشرط. إذا علينا تعديل البحث من /hi/ إلى /hi\b/
preg_replace("/hi\b/", "hello",$x);وهنا سيتم تغير hi فقط والتي في حالتنا موجودة في أول الجملة.
ولكن ماذا إن أردنا استبداله الكلمة it في الجملة [ien]it is a cat, you can’t hit it[/ien] إلى this بنفس المنطق (جملة غير منطقية ولكن للتدريب فقط)
<?php $x = "it is a cat, you shouldn't hit it"; echo preg_replace("/it\b/", "this",$x); ?>تكون النتيجة
this is a cat, you shouldn't hthis thisهنا حدث الآتي:
قام المحرك بالبحث عن it فوجدها في بداية الجملة ثم استمر في البحث إلى أن وجد أيضاً it في كلمة hit وكان يفصلها عن التي تليها مسافة وبالتالي اعتبر أنه وصل لحدود الكلمة التي قمنا بتحديدها، وبالتالي قام باستبدالها هي الأخرى ثم استمر حتى وجد it في نهاية الجملة واستبدلها هي الأخرىوبالتالي علينا أيضا تحديد أن تكون الكلمة منفصلة عن ما قبلها حتى يتم استبدالها، أو بمعنى آخر عمل حدود بداية الكلمة هكذا /\bit\b/
preg_replace("/\bit\b/", "this",$x);تكون النتيجة
this is a cat, you can't hit thisلكن ربما تفكر أنه ليس من المنطقي تغير it في آخر الجملة إلى this، وهنا نحتاج لشي يمنع المطابقة إذا كانت الكلمة في نهاية السطر، وهنا نحتاج لتقنية أخرى لمحركات البحث وهي البحث الأمامي والخلفي Regex lookaround (نتحدث عنها في موضوع منفصل) وهي باختصار قم بمطابقة الشيء إذا كان/إذا لم يكن بعده أو قبله كذا. وإذا كنت فضولي فإليك كيف تقوم بها.
preg_replace("/\bit\b(?!$)/", "this",$x);
