ویژگی تصویر

تابع chop() در PHP

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

تابع chop() در PHP تابعی ساده ولی پر کاربرد برای حذف کاراکترهای اضافه از انتهای رشته است. اگر با توابع trim() و rtrim() آشنا باشید، باید بدانید که chop() در واقع نام مستعار (alias) تابع rtrim() است و رفتار یکسانی دارد.

خلاصهٔ عملکرد

نام تابعامضای تابعتوضیح
chopstring chop(string $str [, string $character_mask ])حذف کاراکترهای مشخص (یا فاصله‌های سفید پیش‌فرض) از انتهای رشته
rtrimstring rtrim(string $str [, string $character_mask ])همان chop — حذف از انتهای رشته

پارامترها

  • $str: رشته ورودی که قرار است اصلاح شود.
  • $character_mask (اختیاری): مجموعه‌ای از کاراکترها که باید از انتها حذف شوند. اگر داده نشود، پیش‌فرض مجموعهٔ فاصله‌های سفید PHP است (شامل فضای خالی، تب، خط جدید، CR، NULL و غیره).

مثال‌های پایه

<?php
// مثال ساده با newline
$line = "Hello, world!n";
echo chop($line); // خروجی: Hello, world!

// حذف چند نوع فاصله
$str = "Data  tn";
echo chop($str); // فاصله‌ها و تب و newline حذف می‌شود
?>

در این مثال‌ها chop() همانطور که انتظار می‌رود، فاصله‌ها و کاراکترهای whitespace در انتهای رشته را حذف می‌کند.

توضیح

کد اول یک خط با newline ایجاد می‌کند و chop آن newline را حذف می‌کند. کد دوم نشان می‌دهد که chop به صورت پیش‌فرض انواع فاصله‌های نهایی را حذف می‌کند.

استفاده از character_mask — نکات حیاتی

<?php
// استفاده از character_mask
$s = "foobarxyz";
echo chop($s, "xyz"); // ممکن است خروجی: foobar
?>

نکتهٔ مهم: زمانی که از دومین پارامتر استفاده می‌کنید، مقدار داده‌شده به عنوان «مجموعه‌ای از کاراکترها» تفسیر می‌شود، نه به‌عنوان یک پسوند (suffix) کامل. یعنی اگر شما “xyz” را بدهید، هر کاراکتر ‘x’ یا ‘y’ یا ‘z’ که در انتها ظاهر شود حذف خواهد شد — نه لزوماً دنبالهٔ “xyz”.

مثال اشتباه و اصلاح آن

<?php
// اگر بخواهید فقط پسوند خاصی را حذف کنید (مثلاً ".php")
$filename = "index.php";
echo chop($filename, ".php"); // خروجی: index   <-- اشتباه: تمامی کاراکترهای '.', 'p', 'h' حذف می‌شوند
// اصلاح با استفاده از شرط یا preg_replace:
if (substr($filename, -4) === '.php') {
    $filename = substr($filename, 0, -4);
}
echo $filename; // خروجی درست: index
?>

اینجا نشان دادیم که برای حذف کامل یک پسوند بهتر است از بررسی طول و substr یا از الگوی منظم استفاده شود؛ زیرا chop/rtrim با character_mask کاراکترها را جداگانه حذف می‌کند.

موارد کاربردی و نکات فنی

  • برای پاکسازی خط‌های خوانده‌شده از فایل معمولاً از chop() یا rtrim() استفاده می‌شود تا newline و CR حذف شوند.
  • در handling مسیرها، برای حذف اسلش انتهایی از rtrim($path, ‘/’) استفاده می‌شود. دقت کنید که این همهٔ اسلش‌های انتهایی را بر می‌دارد (مثلاً “////” تبدیل می‌شود به “”) — اگر تنها حذف یک اسلش لازم است از preg_replace یا شرط استفاده کنید.
  • chop با کاراکترهای multi-byte (مثل حروف فارسی یا یونیکد) صرفاً بر اساس بایت عمل می‌کند؛ بنابراین برای کارهای حساس به یونیکد از توابع mb_* یا بررسی suffix با mb_substr استفاده کنید.
  • chop یک alias است؛ از نظر عملکرد و کارایی با rtrim یکسان است. انتخاب نام بیشتر به سلیقه یا خوانایی کد بستگی دارد.

مثال حذف اسلش انتهایی در URL

<?php
$url = "https://example.com/path/";
$url = rtrim($url, '/');
echo $url; // https://example.com/path
?>

این روش تمام اسلش‌های انتهایی را حذف می‌کند که معمولاً در ساخت URL یا مسیر فایل مفید است.

چگونگی حذف یک پسوند خاص (روش امن)

<?php
function removeSuffix($str, $suffix) {
    if ($suffix !== '' && substr($str, -strlen($suffix)) === $suffix) {
        return substr($str, 0, -strlen($suffix));
    }
    return $str;
}

echo removeSuffix("file.tar.gz", ".gz"); // خروجی: file.tar
?>

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

حساسیت به encoding و BOM

اگر با فایل‌هایی روبرو هستید که ممکن است BOM (Byte Order Mark) داشته باشند، chop این کاراکترها را حذف نمی‌کند مگر آنکه در character_mask باشند. برای حذف BOM معمولاً از الگوی منظم با flag یونیکد استفاده می‌شود:

<?php
// حذف BOM ابتدای رشته
$str = "xEFxBBxBFThis is text";
$str = preg_replace('/^x{FEFF}/u', '', $str);
echo $str;
?>

این روش برای یونیکد مناسب است و BOM را حذف می‌کند.

خلاصه و بهترین شیوه‌ها

  • برای حذف فاصله‌ها یا newline از انتهای یک رشته می‌توانید chop() (یا rtrim) را استفاده کنید.
  • هنگام استفاده از character_mask به این نکته توجه داشته باشید که کاراکترها به صورت مجموعه‌ای تفسیر می‌شوند، نه پسوند کامل.
  • برای حذف پسوندها یا الگوهای پیچیده از substr/mb_substr یا preg_replace استفاده کنید.
  • برای متون یونیکد و چند بایتی، از توابع mb_* یا الگوهای یونیکد استفاده کنید تا از رفتار غیرمنتظره جلوگیری شود.

در کل، chop تابعی ساده و کاربردی است اما فهم دقیقِ نحوهٔ کار character_mask و محدودیت‌های encoding از بروز خطاهای منطقی جلوگیری می‌کند.

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

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