تابع stristr() در PHP
تابع stristr() در پیاچپی برای جستجوی رشته بهصورت حساس به حروف یا غیرحساس؟ در واقع case-insensitive بهکار میرود. این تابع شبیه strstr() است اما تفاوت اصلی آن نادیده گرفتن تفاوت بین حروف بزرگ و کوچک هنگام جستجوست. در این مقاله بهصورت کامل نحوۀ کار، پارامترها، مثالهای واقعی، نکات کاربردی و جایگزینهای مناسب بررسی میشود.
سینتکس و پارامترها
سینتکس کلی تابع بهشکل زیر است:
stristr(string $haystack, string $needle, bool $before_needle = false): string|falseشرح پارامترها:
- $haystack: رشتهای که میخواهیم در آن جستجو کنیم (نخ یا متن کامل).
- $needle: زیررشتهای که دنبال آن هستیم (میتواند یک کاراکتر یا رشته باشد).
- $before_needle: اگر مقدار true باشد، تابع بخش قبل از اولین وقوع needle را برمیگرداند؛ در غیر این صورت بخش از محل وقوع به بعد را برمیگرداند.
مقدار بازگشتی
چنانچه زیررشته پیدا شود، تابع یک رشته برمیگرداند؛ در غیر این صورت مقدار false بازگشت داده میشود. بنابراین هنگام بررسی خروجی حتماً از مقایسهٔ سخت (=== یا !==) استفاده کنید تا با رشتهٔ خالی اشتباه گرفته نشود.
مثالهای عملی
<?php
$haystack = "Hello World, PHP is great!";
$result = stristr($haystack, "world");
var_dump($result); // رشتهای که از "World" به بعد بازمیگردد
// قبل از needle
$before = stristr($haystack, "php", true);
var_dump($before); // "Hello World, "
?>توضیح: کد بالا ابتدا با stristr بهصورت case-insensitive دنبال “world” میگردد و چون پیدا میشود، بخش از محل یافتن تا انتهای رشته را برمیگرداند. در نمونهٔ دوم با تنظیم پارامتر سوم روی true، بخش قبل از “php” بازگشت داده میشود.
بررسی وجود با !== false
<?php
if (stristr($text, 'needle') !== false) {
// یافت شد
} else {
// یافت نشد
}
?>توضیح: استفاده از !== false ضروری است زیرا مقدار بازگشتی ممکن است رشتهای باشد که مقدار آن در مقایسهٔ سست برابر false شود. مقایسهٔ سخت اطمینان میدهد که تفاوت بین رشته و false حفظ شود.
موارد کاربرد و مثالهای واقعی
- استخراج دامنه یا مسیر از URL: پیدا کردن “http” یا “https” و سپس جدا کردن باقی مسیر.
- پارس کردن هدرهای ایمیل یا متن: یافتن اولین occurrence کلید خاص (مثل “Subject:”).
- چک کردن وجود کلمات کلیدی در متن بدون توجه به حروف بزرگ و کوچک (مثلاً واژههای ممنوعه).
- تبدیل و استخراج بخشی از رشته قبل از یک علامت خاص (مثلاً قبل از علامت “@”).
<?php
$email = "user@example.com";
$beforeAt = stristr($email, "@", true); // returns "user"
echo $beforeAt;
?>توضیح: مثال بالا نام کاربری ایمیل را تا قبل از علامت @ استخراج میکند. این روش سریع و خواناست ولی برای اعتبارسنجی ایمیل باید از توابع مخصوص استفاده شود.
مقایسه با توابع مشابه
| تابع | حساسیت به حروف | کاربری اصلی |
|---|---|---|
| strstr() | حساس (case-sensitive) | برگرداندن بخش از اولین occurrence |
| stristr() | غیرحساس (case-insensitive) | مشابه strstr اما بدون رعایت بزرگی/کوچکی حروف |
| strpos(), stripos() | strpos حساس، stripos غیرحساس | بازگشت موقعیت عددی اولین occurrence |
| mb_stristr() | غیرحساس و مناسب برای چندبایتی | پشتیبانی از UTF-8 و سایر encodingها (نیاز به mbstring) |
نکته: برای دریافت موقعیت از توابعی مثل stripos() استفاده کنید. اگر میخواهید جایگاه یا طول را بدانید، گرفتن رشته و سپس استفاده از strlen() یا strpos() مفید است.
نکات، محدودیتها و بهترین شیوهها
- stristr برای متون UTF-8 و زبانهایی با کاراکترهای چندبایتی مناسب نیست. در این موارد از
mb_stristr()استفاده کنید. - برای مقایسه یا چک کردن وجود، از عملگرهای هویتی (=== و !==) استفاده شود تا false با رشتهٔ خالی اشتباه گرفته نشود.
- اگر فقط نیاز به موقعیت دارید، استفاده از
stripos()از نظر کارایی بهتر است چون نیازی به تخصیص رشتهٔ جدید به حافظه ندارد. - در متون خیلی بزرگ یا هنگامی که تعداد زیادی جستجو نیاز است، پروفایلینگ و تست عملکرد انجام دهید؛ در برخی موارد پیادهسازی بر پایهٔ توابع مخصوص یا regexp کاراتر خواهد بود.
نمونهٔ بهبود یافته: بررسی و استخراج امن
<?php
function extractAfterCaseInsensitive(string $haystack, string $needle): ?string {
$res = stristr($haystack, $needle);
if ($res === false) {
return null; // پیدا نشد
}
return $res;
}
$txt = "Version: 1.2.3; Release";
echo extractAfterCaseInsensitive($txt, "version:"); // "Version: 1.2.3; Release"
?>توضیح: این تابع یک لایهٔ پوششی ایجاد میکند که در صورت نبودن needle مقدار null بازمیگرداند و از اشکال احتمالی جلوگیری میکند. بازگشت null بهجای false ممکن است در طراحی API خواناتر باشد.
نتیجهگیری
تابع stristr() ابزار ساده و مؤثری برای جستجوی غیرحساس به حروف در رشتههاست و برای استخراج بخشهایی از متن یا بررسی وجود کلمات کلیدی مناسب است. با این حال، برای متون چندبایتی یا زمانی که نیاز به موقعیت عددی دارید، توابع جایگزین مانند mb_stristr() یا stripos() مناسبترند. همیشه هنگام کار با مقدار بازگشتی به نوع داده دقت کنید تا از خطاهای منطقی جلوگیری شود.
آیا این مطلب برای شما مفید بود ؟



