ویژگی تصویر

تابع strpbrk() در PHP

  /  PHP   /  تابع strpbrk() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع strpbrk() یکی از توابع متنی در PHP است که برای جستجو در یک رشته برای پیدا کردن اولین کاراکتری که در لیستی از کاراکترها قرار دارد، استفاده می‌شود. این تابع ساده اما کاربردی است و در پردازش متن، اعتبارسنجی یا پارس کردن رشته‌ها می‌تواند مفید باشد. در ادامه به سینتکس، مثال‌ها، نکات مربوط به چندبایتی (UTF-8)، و راهکارهای بهینه‌سازی می‌پردازیم.

سینتکس و خروجی

پارامترشرح
haystackرشته‌ای که قرار است جستجو شود (string)
char_listلیستی از کاراکترها (هر کاراکتر جداگانه بررسی می‌شود)

خروجی: در صورت پیدا شدن، تابع زیررشته‌ای از haystack را برمی‌گرداند که از اولین کاراکتر پیدا شده شروع می‌شود. در صورت عدم پیدا شدن، مقدار boolean false باز می‌گردد. برای تشخیص درست نتیجه باید از مقایسه سفت و سخت (===) استفاده کرد.

مثال ساده

<?php
$haystack = "hello world";
$chars = "ow";
$result = strpbrk($haystack, $chars);

var_dump($result); // string(5) "o world"
?>

در این مثال تابع اولین کاراکتر از مجموعه “o” یا “w” را می‌یابد؛ اولین مورد «o» در موقعیت 4 است و از آنجا تا انتها رشته «o world» بازگشت داده می‌شود. توجه کنید که خروجی رشته است و برای چک کردن عدم وجود باید از === false استفاده کنید.

نمونه کاربرد: یافتن اولین مصوت

<?php
$text = "rhythm myths";
$vowels = "aeiouAEIOU";
$found = strpbrk($text, $vowels);

if ($found === false) {
    echo "No vowels found.";
} else {
    echo "First vowel and rest: " . $found;
}
?>

در این مثال دنبال اولین مصوت در رشته می‌گردیم. اگر هیچ‌یک از کاراکترهای موجود در لیست پیدا نشوند، مقدار false برگشت می‌دهد. با === false از تداخل با مقادیر رشته‌ای جلوگیری می‌کنیم.

تفاوت strpbrk() با توابع مشابه

  • strpbrk: اولین کاراکتر از لیست را پیدا می‌کند و زیررشته از آن نقطه را بازمی‌گرداند.
  • strstr / strchr: جستجو برای یک زیررشته یا یک کاراکتر خاص (فقط یک مقدار هدف).
  • strcspn: طول پیشوندی که حاوی هیچ‌یک از کاراکترهای لیست نیست را برمی‌گرداند (مناسب برای یافتن موقعیت به‌صورت عددی).

اگر نیاز به موقعیت عددی دارید، می‌توانید از ترکیب strcspn یا strpos استفاده کنید. برای مثال:

<?php
$haystack = "example string";
$chars = "aeiou";
$pos = strcspn($haystack, $chars);

if ($pos === strlen($haystack)) {
    echo "No vowel found";
} else {
    echo "First vowel at position: " . $pos;
}
?>

در این نمونه strcspn طول بخش اولیه بدون مصوت را بازمی‌گرداند؛ اگر برابر طول کل رشته باشد، هیچ‌یک از مصوت‌ها یافت نشده‌اند.

نکات مربوط به UTF-8 و چندبایتی‌ها

strpbrk روی بایت‌ها عمل می‌کند و برای رشته‌های چندبایتی (UTF-8) ممکن است منجر به رفتار نادرست در کاراکترهای غیرلاتین شود. برای کار با متون UTF-8 از توابع چندبایتی مانند mb_strpos یا عبارات منظم با فلگ u استفاده کنید.

<?php
// مثال با preg_match برای پیدا کردن اولین حرف از یک گروه در UTF-8
$text = "سلام دنیا";
$pattern = '/[دنیا]/u';

if (preg_match($pattern, $text, $matches, PREG_OFFSET_CAPTURE)) {
    $foundChar = $matches[0][0];
    $offsetBytes = $matches[0][1];
    $charIndex = mb_strlen(substr($text, 0, $offsetBytes), 'UTF-8');
    echo "Found: $foundChar at character index $charIndex";
} else {
    echo "Not found";
}
?>

در اینجا از preg_match با فلگ u برای پشتیبانی UTF-8 استفاده شده است. توجه داشته باشید که offset که preg_match برمی‌گرداند بر حسب بایت است، برای تبدیل به ایندکس کاراکتری از mb_strlen استفاده شده است.

موارد کاربردی و نکات عملی

  • استفاده برای یافتن اولین نماد یا فاصله خاص در پردازش لاگ‌ها یا پارس رشته‌ها.
  • استفاده همراه با explode یا substr برای جداسازی بخش‌های رشته از اولین کاراکتر خاص.
  • همیشه برای بررسی نتیجه از === false استفاده کنید تا با مقادیر رشته‌ای اشتباه گرفته نشود.
  • برای لیست طولانی کاراکترها عملکرد مناسب است اما برای الگوهای پیچیده بهتر از عبارات منظم یا توابع چندبایتی استفاده کنید.

نمونه پیشرفته: تقسیم رشته از اولین نقطه‌گذاری

<?php
$line = "Value: 123, note: example.";
$delims = ",;.:!";
$found = strpbrk($line, $delims);

if ($found !== false) {
    // position number
    $pos = strlen($line) - strlen($found);
    $before = substr($line, 0, $pos);
    $after = $found; // شامل علامت جداکننده
    echo "Before: '$before'\nAfter: '$after'";
} else {
    echo "No delimiter found";
}
?>

در این مثال ابتدا با strpbrk زیررشته از اولین جداکننده تا انتها گرفته می‌شود. سپس با محاسبه تفاوت طول‌ها، موقعیت عددی جداکننده محاسبه شده و قبل و بعد آن جدا می‌شود. این روش برای جداسازی کلید و مقدار یا پیام‌ها مفید است.

عملکرد و بهینه‌سازی

strpbrk از نظر الگوریتمی خطی نسبت به طول haystack عمل می‌کند. برای مجموعه کاراکترهای بزرگ یا پردازش روی رشته‌های بسیار طولانی، هزینه‌ی جستجو می‌تواند قابل توجه شود. در مواردی که نیاز به یافتن موقعیت عددی دارید، strcspn اغلب سریع‌تر است چون تنها طول پیشوند را محاسبه می‌کند بدون بازگشت زیررشته کامل.

خلاصه و توصیه‌ها

  • strpbrk برای پیدا کردن اولین کاراکتر از مجموعه‌ای از کاراکترها و بازگرداندن زیررشته از آن نقطه مناسب است.
  • برای بررسی عدم وجود نتیجه از === false استفاده کنید.
  • برای متون UTF-8 از توابع چندبایتی یا عبارات منظم با فلگ u استفاده کنید.
  • برای نیاز به موقعیت عددی یا عملکرد بهتر، strcspn یا ترکیب strpos را مد نظر قرار دهید.

با درک دقیق رفتار و محدودیت‌های strpbrk می‌توانید در پاسخ به نیازهای معمول پردازش رشته راهکارهایی ساده و مؤثر پیاده کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: