ویژگی تصویر

تابع substr() در PHP

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

تابع substr() یکی از توابع پایه‌ای مدیریت رشته در PHP است که بخش مشخصی از یک رشته را بازمی‌گرداند. این تابع پرکاربرد و سریع است، اما برای استفاده صحیح باید نکاتی دربارهٔ پارامترها، رفتار با مقادیر منفی و مشکلات مربوط به رشته‌های چندبایتی (مثل UTF-8) در نظر گرفته شود.

امکانات پایه و امضای تابع

پارامترتوضیح
stringرشتهٔ ورودی که قرار است از آن بخشی استخراج شود
startشروع بخش — می‌تواند مقدار مثبت یا منفی باشد
length (اختیاری)طول بخش برای استخراج — اگر حذف شود تا پایان رشته را بازمی‌گرداند؛ مقدار منفی به معنی حذف از انتها

قواعد رفتاری مهم

  • اگر start مثبت باشد، شمارهٔ کاراکتر از ابتدا (شمارش از صفر) در نظر گرفته می‌شود.
  • اگر start منفی باشد، از انتهای رشته شمارش می‌شود (مثلاً -1 یکی مانده به آخر).
  • اگر length منفی باشد، به تعداد مشخصی از انتهای رشته کم می‌شود (یعنی نتیجه تا آن تعداد از انتها کوتاه می‌شود).
  • substr باینری-سِیف (binary-safe) است؛ به این معنی که صرفاً بایت‌ها را جدا می‌کند و به مفهوم کاراکترهای چندبایتی توجهی ندارد.
  • برای رشته‌های چندبایتی (مثل UTF-8) از mb_substr استفاده کنید تا کاراکترها شکسته نشوند.

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

<?php
$s = "Hello, World!";
echo substr($s, 7);         // "World!"
echo substr($s, 7, 5);      // "World"
echo substr($s, -6);        // "World!"
echo substr($s, 0, -1);     // "Hello, World"
?>

در این کد، نشان داده شده که چگونه می‌توان از offset مثبت و منفی و همچنین length منفی استفاده کرد. تابع بخش مورد نظر از رشته را بازمی‌گرداند.

مسئلهٔ رشته‌های UTF-8 و راه‌حل

substr بر بایت‌ها کار می‌کند و برای رشته‌های UTF-8 ممکن است کاراکترها نصفه برش بخورند و نتیجه نا‌مطلوب شود. برای داده‌های چندبایتی از توابع mb_ استفاده کنید.

<?php
$s = "سلام دنیا"; // UTF-8
echo substr($s, 0, 4);     // ممکن است کاراکترها را خراب کند
echo mb_substr($s, 0, 4, 'UTF-8'); // درست: چهار کاراکتر اول
?>

در مثال بالا، substr ممکن است بایت‌ها را قطع کند و خروجی نامفهوم شود. استفاده از mb_substr با مشخص کردن انکدینگ (‘UTF-8’) تضمین می‌کند که بر اساس کاراکترهای واقعی عملیات انجام شود.

نمونه: کوتاه‌سازی متن با افزودن “…” (برای UTF-8)

<?php
function truncate($text, $max = 50, $encoding = 'UTF-8') {
    if (mb_strlen($text, $encoding) <= $max) {
        return $text;
    }
    return mb_substr($text, 0, $max - 3, $encoding) . '...';
}

echo truncate('این یک متن نمونه برای تست کوتاه‌سازی است', 20);
?>

این تابع با استفاده از mb_strlen و mb_substr رشته را ایمن برای UTF-8 کوتاه می‌کند و در صورت لزوم سه نقطه اضافه می‌نماید. توجه داشته باشید که تعداد کاراکترهای نقطه نیز در محاسبهٔ نهایی لحاظ شده است.

موارد ویژه و نکات ایمنی

  • از PHP 8 به بعد، ارسال آرایه به توابعی که رشته می‌خواهند ممکن است خطا (TypeError) ایجاد کند؛ تأکید می‌شود ورودی را با (string) یا کنترل نوع تایپ کنید.
  • برای استخراج بایت‌ها از تابع substr مناسب است، اما برای کار با کاراکترها از mb_substr استفاده کنید.
  • substr سریع است و در اغلب موارد از regex برای برش رشته ارجح است؛ مگر اینکه الگوی پیچیده‌ای مد نظر باشد.
  • اگر نیاز به مقایسهٔ بخشی از رشته دارید، بررسی کنید substr_compare یا strncmp گزینهٔ مناسب‌تری نباشد (برای مقایسهٔ سریع بدون تخصیص رشتهٔ جدید).

مثال پیشرفته: محافظت در برابر ورودی نامعتبر و پشتیبانی از ترکیب ANSI/UTF-8

<?php
function safe_substr($s, $start, $length = null, $encoding = null) {
    // اگر انکدینگ تعیین شده باشد از mb_substr استفاده کن
    if ($encoding !== null && function_exists('mb_substr')) {
        if ($length === null) return mb_substr($s, $start, null, $encoding);
        return mb_substr($s, $start, $length, $encoding);
    }
    // در غیر اینصورت از substr معمولی استفاده کن
    if ($length === null) return substr($s, $start);
    return substr($s, $start, $length);
}
?>

این تابع یک لایهٔ محافظتی ساده فراهم می‌کند تا در صورت نیاز با انکدینگ مشخص از mb_substr و در غیر اینصورت از substr استفاده شود. چنین رویکردی برای کتابخانه‌هایی که ممکن است روی سیستم‌هایی بدون ext-mbstring اجرا شوند مفید است.

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

  • برای داده‌های ASCII یا باینری از substr استفاده کنید؛ سریع و ساده است.
  • برای UTF-8 یا سایر انکدینگ‌های چندبایتی همواره از mb_substr (و mb_strlen) استفاده کنید تا کاراکترها نشکنند.
  • در تولید خروجی‌هایی مانند خلاصه متن، قابلیت کوتاه‌سازی امن و افزودن الحاقات (مثلاً …) را با توجه به طول نهایی در نظر بگیرید.
  • رفتار با پارامترهای منفی و مقداردهی ورودی را حتماً کنترل کنید تا خطا یا خروجی غیرمنتظره نداشته باشید.

با درک قواعد ساده فوق و توجه به انکدینگ‌ها، substr و خانوادهٔ توابع mb می‌توانند ابزارهای بسیار قدرتمندی برای پردازش متون در PHP باشند.

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

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