تابع substr() در 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 باشند.
آیا این مطلب برای شما مفید بود ؟




