پسبینیها (lookahead) و پیشبینیها (lookbehind) در عبارات با قاعده (RegEx) الگویی را مشخص میکنند که پس از یا پیش از الگوی بخصوص دیگری قرار گرفته یا نگرفته باشد.
مثالهای پسبینی منفی
برای جستوجو و مشخص کردن عبارت “hello” به شرط نبودن عبارت “world” پس از آن، از (?! world)
استفاده میکنیم.
نمونه 1
پس از “hello” کلمه “world” وجود دارد بنابراین پسبینی منفی شکست میخورد.
1 2 3 4 5 6 7 | <?php if (preg_match('/hello(?! world)/i', "hello world", $matches, PREG_OFFSET_CAPTURE)) { echo "matched string:\n{$matches[0][0]} (at offset {$matches[0][1]})\n"; } else { echo "No match\n"; } ?> |
خروجی:
1 | No match |
نمونه 2
پس از “hello” کلمه “world” وجود ندارد بنابراین پسبینی منفی نتیجه بخش خواهد بود.
1 2 3 4 5 6 7 | <?php if (preg_match('/hello(?! world)/i', "hello something else", $matches, PREG_OFFSET_CAPTURE)) { echo "matched string:\n{$matches[0][0]} (at offset {$matches[0][1]})\n"; } else { echo "No match\n"; } ?> |
خروجی:
1 2 | matched string: hello (at offset 0) |
مثالهای پسبینی مثبت
برای جایگزین کردن عبارت “hello” (با NEWVAL) به شرط وجود داشتن کلمه “world” پس از آن، از (?= world)
استفاده میکنیم.
نمونه 1
1 2 3 4 5 6 7 8 9 | <?php $str = "hello world"; $newstr = preg_replace('/hello(?= world)/i', 'NEWVAL', $str, -1, $count); if ($count > 0) { echo "newstr after $count replacement(s):\n$newstr\n"; } else { echo "No replacement\n"; } ?> |
خروجی:
1 2 | newstr after 1 replacement(s): NEWVAL world |
نمونه 2
1 2 3 4 5 6 7 8 9 | <?php $str = "hello something else"; $newstr = preg_replace('/hello(?= world)/i', 'NEWVAL', $str, -1, $count); if ($count > 0) { echo "newstr after $count replacement(s):\n$newstr\n"; } else { echo "No replacement\n"; } ?> |
خروجی:
1 | No replacement |
مثالهای پیشبینی منفی
برای مشخص کردن کلمه “hello” به شرط نبودن کاراکتر عددی و حروف انگلیسی قبل از آن، از (?<![a-z0-9])
برای پیشبینی منفی استفاده میکنیم.
نمونه 1
هیچ کاراکتری قبل از کلمه “hello” وجود ندارد.
1 2 3 4 5 6 7 | <?php if (preg_match('/(?<![a-z0-9])hello/i', "hello world", $matches, PREG_OFFSET_CAPTURE)) { echo "matched string:\n{$matches[0][0]} (at offset {$matches[0][1]})\n"; } else { echo "No match\n"; } ?> |
خروجی:
1 2 | matched string: hello (at offset 0) |
نمونه 2
وجود کاراکتر انگلیسی “a” بلافاصله پیش از “hello”.
1 2 3 4 5 6 7 | <?php if (preg_match('/(?<![a-z0-9])hello/i', "ahello", $matches, PREG_OFFSET_CAPTURE)) { echo "matched string:\n{$matches[0][0]} (at offset {$matches[0][1]})\n"; } else { echo "No match\n"; } ?> |
خروجی:
1 | No match |
مثالهای پیشبینی مثبت
برای جایگزین کردن عبارت “hello” (با NEWVAL) به شرط وجود داشتن کلمه “world” پیش از آن، از (?<=hello )
برای پیشبینی مثبت استفاده میکنیم.
نمونه 1
1 2 3 4 5 6 7 8 9 | <?php $str = "hello world"; $newstr = preg_replace('/(?<=hello )world/i', 'NEWVAL', $str, -1, $count); if ($count > 0) { echo "newstr after $count replacement(s):\n$newstr\n"; } else { echo "No replacement\n"; } ?> |
خروجی:
1 2 | newstr after 1 replacement(s): hello NEWVAL |
نمونه 2
1 2 3 4 5 6 7 8 9 | <?php $str = "something world"; $newstr = preg_replace('/(?<=hello )world/i', 'NEWVAL', $str, -1, $count); if ($count > 0) { echo "newstr after $count replacement(s):\n$newstr\n"; } else { echo "No replacement\n"; } ?> |
خروجی:
1 | No replacement |
نکتهها:
- کاراکتر
i
بعد از/
برای نادیده گرفتن بزرگ یا کوچک بودن حروف است. - عبارت مربوط به پسبینی و پیشبینی، بخشی از نتیجه جستوجو در متغیر
$matches
(در فانکشن preg match) نخواهد بود. - عبارت مربوط به پسبینی و پیشبینی توسط فانکشن preg replace جایگزین نخواهد شد.
- کاراکتر