تابع strrpos() در PHP
تابع strrpos() یکی از توابع پرکاربرد رشتهای در PHP است که برای پیدا کردن آخرین وقوع یک زیررشته در یک رشتهٔ بزرگتر بهکار میرود. این تابع بر بایتها عمل میکند، حساس به حروف بزرگ/کوچک است و مقدار شاخص (index) آخرین رخداد را برمیگرداند یا در صورت عدم وجود، مقدار false بازمیگرداند.
قالب فراخوانی و پارامترها
- strrpos(string $haystack, string $needle [, int $offset = 0 ]) : int|false
- $haystack — رشتهای که در آن جستجو میکنیم.
- $needle — زیررشتهای که به دنبال آخرین رخداد آن هستیم.
- $offset — موقعیتی اختیاری که جستجو از آن نقطه شروع (یا با مقدار منفی، از انتها) انجام شود.
خروجی و نکات مهم
| وضعیت | مقدار بازگشتی |
|---|---|
| یافتن رخداد | شاخص عددی (از صفر شروع) |
| عدم یافتن | false |
نکته مهم: چون مقدار بازگشتی میتواند صفر (وقتی رخداد در ابتدای رشته است) باشد، برای تمایز بین 0 و false باید از مقایسهٔ === استفاده کنید.
مثال پایهای
$haystack = "hello world, hello PHP";
$needle = "hello";
$pos = strrpos($haystack, $needle);
if ($pos === false) {
echo "Not found";
} else {
echo "Last occurrence at position: $pos";
}در این مثال آخرین «hello» در موقعیت 13 قرار دارد (اندیسها از صفر شروع میشوند). شرط با === برای تشخیص درست بین 0 و false استفاده شده است.
نمونه عملی: استخراج پسوند فایل
$filename = "archive.tar.gz";
$pos = strrpos($filename, '.');
if ($pos !== false) {
$extension = substr($filename, $pos + 1);
} else {
$extension = '';
}
echo $extension; // خروجی: gzدر این کد با استفاده از strrpos نقطهٔ آخر را پیدا میکنیم تا پسوند نهایی فایل را جدا کنیم. اگر نقطهای وجود نداشته باشد، رشتهٔ خالی برگردانده میشود.
مثال: گرفتن نام فایل از مسیر (basename ساده)
$path = "/var/www/html/index.php";
$pos = strrpos($path, '/');
if ($pos === false) {
$basename = $path;
} else {
$basename = substr($path, $pos + 1);
}
echo $basename; // خروجی: index.phpبا یافتن آخرین «/» میتوان قسمت بعد از آن را بهعنوان نام فایل استخراج کرد. این روش سریع و مرسوم است و در بسیاری از اسکریپتها دیده میشود.
پارامتر offset و مقادیر منفی
پارامتر سوم ($offset) به شما امکان میدهد که جستجو را از یک موقعیت مشخص شروع کنید. اگر مقدار offset منفی باشد، شمارش از انتهای رشته انجام میشود.
$text = "abc abc abc";
echo strrpos($text, "abc", 0); // 8
echo strrpos($text, "abc", 2); // 8
echo strrpos($text, "abc", -4); // 6مثال بالا نشان میدهد که با offset میتوان نتایج متفاوتی گرفت. توجه کنید که رفتار offset در مستندات PHP بهدقت تشریح شده است و برای مقادیر پیچیده باید تست کنید.
مسئلهٔ رشتههای چندبایتی (UTF-8)
strrpos بر اساس بایتها عمل میکند، بنابراین برای رشتههای UTF-8 که حاوی کاراکترهای غیرلاتین هستند ممکن است نتیجهٔ مورد انتظار را ندهد. در این موارد از توابع mb_ استفاده کنید.
// خطا در رشتهٔ چندبایتی
$txt = "سلام دنیا سلام";
echo strrpos($txt, "سلام"); // ممکن است موقعیت غیرمنتظره برگردانددر PHP باید از mb_strrpos استفاده کنید تا جستجو بر اساس کاراکترها (نه بایتها) انجام شود:
mb_internal_encoding("UTF-8");
$txt = "سلام دنیا سلام";
echo mb_strrpos($txt, "سلام"); // موقعیت صحیح بر اساس کاراکترهاپس برای برنامههایی که با متون غیراستاندارد ASCII کار میکنند، توصیه میشود همیشه از توابع mbstring استفاده کنید.
نکات عملکردی و بهترین روشها
- برای بیشتر موارد، strrpos سریع و بهینه است؛ اما اگر رشتهها خیلی بزرگ و تعداد جستجوها زیاد است، بنچمارک بگیرید.
- همیشه از === و !== برای بررسی مقدار بازگشتی استفاده کنید تا خطاهای منطقی بهوجود نیاید.
- در مواجهه با UTF-8 از mb_strrpos استفاده کنید تا اشتباهات محاسباتی در موقعیتها رخ ندهد.
- برای استخراج بخش بعد از آخرین رخداد، الگوی
$pos = strrpos(...); $res = substr(...)سبک و خواناست.
مقایسه با روشهای جایگزین
بعضی از توسعهدهندگان برای یافتن آخرین رخداد، رشته را معکوس کرده و از strpos استفاده میکنند. این روش در موارد خاص میتواند مفید باشد، ولی در بیشتر اوقات strrpos واضحتر و قابل فهمتر است:
// جایگزین نامعمول: معکوس کردن رشته
$revPos = strpos(strrev($haystack), strrev($needle));
if ($revPos !== false) {
$pos = strlen($haystack) - $revPos - strlen($needle);
}این روش کار میکند ولی خوانایی و احتمال خطا در آن بیشتر است؛ مگر اینکه دلیل خاصی برای استفاده از آن وجود داشته باشد.
جمعبندی
تابع strrpos() ابزار قدرتمند و سادهای برای پیدا کردن آخرین وقوع زیررشتهها در PHP است. کافی است نکات مربوط به حساسیت به حروف، بازگشت false و پشتیبانی رشتههای چندبایتی را بدانید تا از این تابع بهصورت ایمن و مؤثر استفاده کنید. برای متنهای UTF-8، همیشه mb_strrpos را مدنظر قرار دهید.
آیا این مطلب برای شما مفید بود ؟



