فهرست

"string manipulation withLaravel"

مقدمه

در این مطلب کلاس Illuminate\Support\Str و متدهای آن در لاراول را بررسی می‌کنیم. تمام تلاش خود را کرده‌ام تا با طبقه‌بندی متدها و ارائه‌ی توضیحات شفاف و مثال‌های متنوع منبع قابل اتکایی برای مطالعه و مراجعه‌های مکرر علاقمندان فراهم کنم.

بیائید کار را با بازی با چند متد شروع کنیم.

بازی

متد length: پیدا کردن طول استرینگ

متد Str::length() طول استرینگ داده شده را بر می‌گرداند.

use Illuminate\Support\Str;
 
echo Str::length('123456789');
// 9

متد wordCount: شمارش تعداد کلمات استرینگ

با متد Str::wordCount() می‌توان تعداد کلمات یک استرینگ را به دست آورد.

use Illuminate\Support\Str;
 
echo Str::wordCount('I am Mohsen Safari.');
// 4

متد password: ایجاد یک کلمه‌ی عبور تصادفی به طول دلخواه

متد Str::password() یک کلمه‌ی عبور شامل حروف، اعداد، symbol ها ایجاد می‌کند. اگر آرگومانی به آن ندهیم طول کلمه‌ی عبور ایجاد شده ۳۲ کاراکتر خواهد بود. با دادن یک عدد به عنوان آرگومان می‌توان طول کلمه‌ی عبور را تعیین کرد.

use Illuminate\Support\Str;
 
$password = Str::password();
// ZC?Mx8[D??eBY;W%nE>!)1N)yCMHwgSU
 
// find generated password's length
echo Str::length($password);
// 32
 
echo Str::password(5);
// .5$gR

متد random: تولید یک string تصادفی به طول دلخواه

با متد Str::random() می‌توان یک استرینگ تصادفی به طول داده شده تولید کرد.

use Illuminate\Support\Str;
 
echo Str::random(32)
// 5p30EhUg0C1euLnMY41wb7P6AVrj1BoH

متد createRandomStringsUsing: ایجاد string تصادفی توسط یک closure

با رجیستر کردن یک closure توسط متد Str::createRandomStringsUsing() می‌توان منطق تولید کلمه‌ی random را در دست گرفت. با این امکان می‌توان کلمات رندوم فیک تولید کرد و یا اینکه همیشه یک کلمه را برگرداند.

use Illuminate\Support\Str;
 
Str::createRandomStringsUsing(function () {
return 'Alireza Amini';
});
 
echo Str::random();
// Alireza Amini
echo Str::random(2);
// Alireza Amini

مشاهده می‌کنید که در این حالت درخواست ایجاد کلمه‌ی تصادفی به طول ۲ کاراکتر هیچ تاثیری ندارد و عینا مقدار برگشتی از تابع رجیستر شده به عنوان خروجی متد منظور می‌شود.

متد createRandomStringsNormally: برگرداندن منطق تولید استرینگ تصادفی به حالت اولیه

بعد از اینکه کارمان در مرحله قبل تمام شد لازم است به لاراول بفهمانیم که از این به بعد استرینگ تصادفی را به شیوه‌ی اولیه خودش تولید کند و نه با استفاده از تابع رجیستر شده. این کار توسط متد Str::createRandomStringsNormally انجام می‌شود.

use Illuminate\Support\Str;
 
Str::createRandomStringsUsing(function () {
return 'Alireza Amini';
});
 
echo Str::random();
// Alireza Amini
 
Str::createRandomStringsNormally();
 
echo Str::random();
// Y8bfGOcjhR06Uub3

متد wrap: محاط کردن استرینگ بین استرینگ‌های دیگر

با متد Str::wrap() می‌توان استرینگ را بین دو استرینگ دیگر محاط کرد.

use Illuminate\Support\Str;
 
echo Str::wrap('Mohsen', '<', '>');
// <Mohsen>
 
echo Str::wrap("Mohsen", '"');
// echo Str::wrap("Mohsen", '"');

متد unwrap: معکوس کردن wrap

با متد Str::unwrap() می‌توان استرینگ‌های محاط کننده‌ را از ابتدا و انتهای استرینگ اصلی حذف کرد.

use Illuminate\Support\Str;
 
echo Str::unwrap('<Mohsen>', '<', '>');
// Mohsen
 
echo Str::unwrap('"Dar jahan che khabar ast?!"', '"');
// Dar jahan che khabar ast?!

متد reverse: معکوس کردن استرینگ

با متد Str::reverse() می‌توان استرینگ داده شده را معکوس کرد.

use Illuminate\Support\Str;
 
echo Str::reverse('Dokaj.com');
// moc.jakoD

متد repeat: تکرار استرینگ به دفعات دلخواه

با متد Str::repeat()می‌توان استرینگ داده شده را به تعداد دلخواه پشت سر هم تکرار کرد.

use Illuminate\Support\Str;
 
$str = Str::repeat('Salam ', 3);
echo $str;
// Salam Salam Salam
 
echo Str::wrap($str, '<', '>');
// <Salam Salam Salam >

متد substrCount: پیدا کردن تعداد رخداد یک زیر رشته در استرینگ اصلی

با متد Str::substrCount() می‌توان تعداد وقوع یک زیر رشته در استرینگ اصلی را پیدا کرد.

use Illuminate\Support\Str;
 
echo Str::substrCount('This is my laptop', 'is');
// 2

همان طور که مشاهده می‌کنید رشته‌ی is دو بار در استرینگ اصلی تکرار شده است.

متد remove: حذف یک رشته از استرینگ اصلی

با متد Str::remove() می‌توان یک زیر رشته یا آرایه‌ای از زیر رشته‌ها را از استرینگ اصلی حذف کرد.

use Illuminate\Support\Str;
 
echo Str::remove('reza', 'I am Alireza Amini');
// I am Ali Amini
 
echo Str::remove(['Ali', 'Javad'], 'Hossein, Ali, Javad and Reza');
// Hossein, , and Reza

عملیات یافتن زیر رشته به صورت case-sensitive انجام می‌شود. برای غیر فعال کردن این ویژگی می‌توان false را به عنوان آرگومان سوم به متد فوق ارسال کرد.

متد mask: مخفی کردن کاراکترهای استرینگ با یک کاراکتر دلخواه

گاهی اوقات به عنوان مثال لازم است تعدادی از ارقام شماره‌ی موبایل را با کاراکتر * پوشاند و نتیجه را در صفحه نمایش داد. این کار توسط متد Str::mask() انجام می‌شود.

در مثال زیر از اندیس چهارم به طول چهار کاراکتر با * پوشانده می‌شوند.

use Illuminate\Support\Str;
 
echo Str::mask('09124650325', '*', 4, 4);
// 0912****325

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

use Illuminate\Support\Str;
 
echo Str::mask('09124650325', '*', -7, 4);
// 0912****325

اگر آرگومان چهارم منفی باشد دیگر معنای length نمی‌دهد بلکه به نقطه‌ی پایان پوشاندن از انتهای رشته‌ی اصلی اشاره می‌کند.

use Illuminate\Support\Str;
 
echo Str::mask('09124650325', '*', 4, -3);
// 0912****325

متد toBase64: تبدیل استرینگ به Base64

متد Str::toBase64() استرینگ داده شده را با Base64 کد می‌کند.

use Illuminate\Support\Str;
 
echo Str::toBase64('Mohsen');
// TW9oc2Vu

نگارش ترکیبی کلمات

متد camel

متد Str::camel() استرینگ ورودی را به شکل camelCase برمی‌گرداند. به فرمت‌های مختلف استرینگ ورودی توجه کنید.

use Illuminate\Support\Str;
 
echo Str::camel("ali-reza-amini");
// aliRezaAmini
 
echo Str::camel("ali_reza_amini");
//aliRezaAmini
 
echo Str::camel("AliRezaAmini");
// aliRezaAmini
 
echo Str::camel("Ali Reza Amini");
// aliRezaAmini

متد kebab

متد Str::kebab() استرینگ ورودی را به شکل kebab-case تبدیل می‌کند.

use Illuminate\Support\Str;
 
echo Str::kebab('AliRezaAmini');
// ali-reza-amini
 
echo Str::kebab('aliRezaAmini');
// ali-reza-amini
 
echo Str::kebab('ali reza amini');
// ali-reza-amini

متد snake

متد Str::snake() استرینگ ورودی را به فرم snake_case بر‌می‌گرداند. به استرینگ ورودی و خروجی متد توجه کنید.

use Illuminate\Support\Str;
 
echo Str::snake('AliReZaAmini');
// ali_re_za_amini
 
echo Str::snake("ali reza amiNi");
// ali_reza_ami_ni
 
echo Str::snake("Ali-Reza-Amini");
// ali-_reza-_amini
 
echo Str::snake("aliRezaAmini");
// ali_reza_amini

متد studly

متد Str::studly() استرینگ ورودی را به فرم StudlyCase یا PascalCase تبدیل می‌کند. به استرینگ ورودی و خروجی متد توجه کنید.

use Illuminate\Support\Str;
 
echo Str::studly('aliRezaAmini');
// AliRezaAmini
 
echo Str::studly('ali_reZa_amini');
// AliReZaAmini
 
echo Str::studly('ali-reza-amiNi');
// AliRezaAmiNi
 
echo Str::studly("ali reza AmiNi");
// AliRezaAmiNi

متد headline

متد Str::headline() استرینگ ورودی که کلماتش بر مبنای تغییر case یا بر مبنای - و یا بر مبنای _ از هم جدا شده‌اند را با space از هم جدا می‌کند و اولین حرف هر کلمه را به حرف بزرگ تبدیل می‌کند. در واقع به نوعی بر عکس کننده‌ی چهار متد بالا است.

use Illuminate\Support\Str;
 
echo Str::headline('aliRezaAmini');
// Ali Reza Amini
 
echo Str::headline('ali-reza-amini');
// Ali Reza Amini
 
echo Str::headline('AliRezaAmini');
// Ali Reza Amini

تغییر case استرینگ

متد upper: با حروف بزرگ نوشتن استرینگ ورودی

متد Str::upper() استرینگ ورودی را به طور کامل با حروف بزرگ برمی‌گرداند.

use Illuminate\Support\Str;
 
echo Str::upper('My naMe is MohSen SaFari');
// MY NAME IS MOHSEN SAFARI

متد lower: با حروف کوچک نوشتن استرینگ ورودی

متد Str::lower() استرینگ ورودی را تماما با حروف کوچک برمی‌گرداند.

use Illuminate\Support\Str;
 
echo Str::lower('My naME iS MohsEn safarI');
// my name is mohsen safari

متد ucfirst: با حرف بزرگ نوشتن اولین کاراکتر استرینگ ورودی

متد Str::ucfirst() اولین کاراکتر استرینگ ورودی را به upper case تبدیل می‌کند.

use Illuminate\Support\Str;
 
echo Str::ucfirst('my name is mohsen');
// My name is mohsen

متد lcfirst: با حرف کوچک نوشتن اولین کاراکتر استرینگ ورودی

متد Str::lcfirst() اولین کاراکتر استرینگ ورودی را به lower case تبدیل می‌کند.

use Illuminate\Support\Str;
 
echo Str::lcfirst('MY NAME IS MOHSEN');
// mY NAME IS MOHSEN

متد title

متد Str::title() هر کلمه‌ای را که تشخیص بدهد حرف اولش را به بزرگ و مابقی حروف را به کوچک تبدیل می‌کند، به عبارت دیگر آن را title case می‌کند. کلماتی که بعد از space و یا _ و یا - بیایند به عنوان کلمه‌ی جدید محسوب می‌شوند.

use Illuminate\Support\Str;
 
echo Str::title("I LOVE YOU");
// I Love You
 
echo Str::title("Che-dar-chante-dari");
// Che-Dar-Chante-Dari
 
echo Str::title("Man_tO_RA_neMishenasam");
// Man_To_Ra_Nemishenasam

شروع و پایان

متد start: اطمینان از شروع شدن استرینگ با کاراکترهای دلخواه

متد Str::start() بررسی می‌کند که آیا استرینگ ورودی با کاراکترهایی که کاربر به عنوان آرگومان دوم وارد کرده است شروع می‌شود یا نه. اگر شروع می‌شود که هیچ! همان استرینگ ورودی را برمی‌گرداند. در غیر این صورت کاراکترهای داده شده را به اول استرینگ prepend می‌کند و نتیجه را برمی‌گرداند.

use Illuminate\Support\Str;
 
echo Str::start(">>> This string starts with >>> originally", ">>>");
// >>> This string starts with >>> originally
 
echo Str::start("this string is prepended with > via Str::start() second argument", "> ");
// > this string is prepended with > via Str::start() second argument

متد finsih: اطمینان از پایان یافتن استرینگ ورودی با کاراکترهای دلخواه

متد Str::finsih() بررسی می‌کند که آیا استرینگ ورودی با کاراکترهای فراهم شده توسط آرگومان دوم تمام شده است یا نه. اگر تمام شده بود که هیچ! همان استرینگ ورودی را برمی‌گرداند. در غیر این صورت کاراکترهای آرگومان دوم را به انتهای استرینگ اضافه می‌کند و نتیجه را برمی‌گرداند.

use Illuminate\Support\Str;
 
echo Str::finish('Chizi baraye goftan nist', ' ...');
// Chizi baraye goftan nist ...
 
echo Str::finish("My name is Mohsen.", '.');
// My name is Mohsen.

پر کردن فضای خالی

متد padRight: پر کردن فضای خالی سمت راست با کاراکترهای دلخواه

متد Str::padRight() استرینگ ورودی را در سمت چپ فضای داده شده به طول آرگومان دوم قرار می‌دهد، سپس فضای خالی در سمت راست استرینگ را _ تا زمانی که طول استرینگ حاصله به طول دلخواه (آرگومان دوم) برسد _ با تکرار کاراکترهایی که توسط آرگومان سوم فراهم شده است پر می‌کند.

use Illuminate\Support\Str;
 
echo Str::padRight("My name is Mohsen.", 80, '<');
// My name is Mohsen.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

متد padLeft: پر کردن فضای خالی سمت چپ با کاراکترهای دلخواه

متد Str::padLeft() استرینگ ورودی را در سمت راست فضای داده شده به طول آرگومان دوم قرار می‌دهد، سپس فضای خالی در سمت چپ استرینگ را _ تا زمانی که طول استرینگ حاصله به طول دلخواه (آرگومان دوم) برسد _ با تکرار کاراکترهایی که توسط آرگومان سوم فراهم شده است پر می‌کند.

use Illuminate\Support\Str;
 
echo Str::padLeft("My name is Mohsen.", 80, '>');
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>My name is Mohsen.

متد padBoth: پر کردن فضای خالی طرفین استرینگ ورودی با کاراکترهای دلخواه

متد Str::pad‌Both() استرینگ ورودی را در وسط فضای مشخص شده به طول آرگومان دوم قرار می‌دهد، سپس فضاهای خالی در طرفین استرینگ را _ تا زمانی که طول استرینگ حاصله به طول دلخواه (آرگومان دوم) برسد _ با تکرار کاراکترهایی که توسط آرگومان سوم فراهم شده است پر می‌کند.

use Illuminate\Support\Str;
 
echo Str::padBoth('In the name of God', 30, '.:.');
// .:..:.In the name of God.:..:.

تست‌ها یا متدهایی که true یا false برمی‌گردانند.

متد contains

متد Str::contains() بررسی میکند که آیا substring یا حداقل یک عنصر از آرایه‌ی substring های داده شده به عنوان آرگومان دوم در استرینگ اصلی وجود دارد یا نه.

use Illuminate\Support\Str;
 
if (Str::contains("My name is Mohsen", "Mohsen")) {
echo "Mohsen Exists in string";
}
// Mohsen Exists in string
 
 
if (Str::contains("Ali and Reza and Javad are freinds", ["Reza", "Naghi", "Taghi"])) {
echo "At least one of the provided names exists in string";
}
// At least one of the provided names exists in string

متد containsAll

در متد Str::containsAll() آرگومان دوم آرایه است و برعکس متد Str::contains() که وجود تنها یک عنصر آن در استرینگ اصلی کافی بود اینجا تمام عناصر آرایه باید در استرینگ اصلی موجود باشند. آرگومان سوم در صورت وجود باید bool باشد و به معنای ignore case است. مقدار پیش‌فرض آن false است.

use Illuminate\Support\Str;
 
$result = Str::containsAll('Ali Mohsen Reza doost hastand.', ["Ali", "Mohsen", "Reza"]);
// true
 
$result = Str::containsAll('Ali Mohsen Reza doost hastand.', ["Ali", "Mohsen", "reza"]);
// false
 
$result = Str::containsAll('Ali Mohsen Reza doost hastand.', ["Ali", "Mohsen", "reza"], true);
// true

متد startsWith

متد Str::startsWith() به عنوان آرگومان دوم یک استرینگ و یا آرایه‌ای از استرینگ‌ها دریافت می‌کند. اگر استرینگ اصلی با استرینگ آرگومان دوم و یا یکی از عناصر آرایه‌ی موجود در آرگومان دوم شروع شده باشد متد true و در غیر این صورت false برمی‌گرداند.

use Illuminate\Support\Str;
 
$result = Str::startsWith("Man mohsen hastam", "Man");
// true
 
$result = Str::startsWith("I love you", ["I", "We", "They"]);
// true
 
$result = Str::startsWith("What is your name?", "Ali");
// false

متد endsWith

متد Str::endsWith() به مانند متد Str::startsWith() به عنوان آرگومان دوم یک استرینگ و یا آرایه‌ای از استرینگ‌ها می‌گیرد. اگر استرینگ اصلی به استرینگ آرگومان دوم و یکی یکی از عناصر آرگومان دوم خاتمه یافته باشد متد مقدار true و در غیر این صورت false برمی‌گرداند.

use Illuminate\Support\Str;
 
$result = Str::endsWith("Are you Reza", "Reza");
// true
 
$result = Str::endsWith("I love Laravel", ["Kate", "Sara", "Susan"]);
// false
 
$result = Str::endsWith("This is my site.", ["table", "site."]);
// true

به نقطه‌ی قرار گرفته در انتهای site توجه کنید. استرینگ نه بهsite بلکه به site. ختم می‌شود.

متد isUrl

Str::isUrl() بررسی می‌کند که آیا استرینگ داده شده یک URL صحیح است یا نه. به عنوان آرگومان دوم می‌توان به متد آرایه‌ای از پرتوکل‌های مورد قبول را داد.

use Illuminate\Support\Str;
 
$result = Str::isUrl('http://dokaj.com');
// true
 
$result = Str::isUrl('http://dokaj.com', ['https']);
// false
 
$result = Str::isUrl("ftp://user:password@server/pathname");
// true
 
$result = Str::isUrl("ftp://user:password@server/pathname", ['http', 'https']);
// false

در مثال سوم توجه کنید که استرینگ اصلی شامل url یک آدرس ftp است و متد آن را به عنوان یک url صحیح شناسایی کرده است ولی در مثال آخر با محدود کردن پروتوکل‌های مورد قبول توسط آرایه‌ی آرگومان دوم دیگر آن را به عنوان یک url صحیح نمی‌شناسد و false برمی‌گرداند.

متد isAscii

Str::isAscii() در صورتی که تمام کاراکترهای استرینگ اصلی جزو کاراکترهای اسکی (۷ بیتی) باشند true و در غیر این صورت false برمی‌گرداند.

use Illuminate\Support\Str;
 
$result = Str::isAscii('Man mohsen hastam');
// true
 
$result = Str::isAscii('Pouvez-vous répéter s’il vous plaît?');
// false

متد isJson

Str::isJson() بررسی می‌کند که آیا استرینگ داده شده یک استرینگ json صحیح و سالم هست یا نه.

use Illuminate\Support\Str;
 
$result = Str::isJson('[1, 3, 5]');
// true
 
$result = Str::isJson("{'name': 'Mohsen', 'Family': 'Safari'}");
// false
 
$result = Str::isJson('{"name": Mohsen, "Family": Safari}');
// false
 
$result = Str::isJson('{"name": "Mohsen", "Family": "Safari"}');
// true

متد isUuid

متد Str::isUuid() بررسی می‌کند که آیا استرینگ ورودی یک UUID صحیح هست یا نه.

use Illuminate\Support\Str;
 
$result = Str::isUuid('550e8400-e29b-41d4-a716-446655440000');
// true
 
$result = Str::isUuid('113059749145936325402354257176981405696');
// false
 
// removing hypens
$result = Str::isUuid('550e8400e29b41d4a716446655440000');
// false
 
$result = Str::isUuid("Mohsen");
// false

متد isUlid

Str::isUlid() بررسی می‌کند که آیا استرینگ ورودی یک ULID صحیح هست یا نه.

use Illuminate\Support\Str;
 
$result = Str::isUlid('01ARZ3NDEKTSV4RRFFQ69G5FAV');
// true
 
$result = Str::isUlid('01G65Z755AFWAKHE12NY0CQ9FH');
// true

متد is

Str::is() استرینگ اصلی را با یک pattern مقایسه می‌کند. چنانچه استرینگ اصلی به طور کامل منطبق بر الگو باشد true و در غیر این صورت false برمی‌گرداند. برخلاف اکثر متدهای بررسی شده، در متد Str::is() استرینگ اصلی به عنوان آرگومان دوم وارد می‌شود و pattern آرگومان اول است.

به نظر می‌رسد در pattern تنها مجاز به استفاده از * هستیم(؟)

use Illuminate\Support\Str;
 
$result = Str::is('Mo*en', 'Mohsen');
// true
 
$result = Str::is('en', 'Mohsen');
// false
 
$result = Str::is('M*n', 'Mohsen');
// true

کوتاه کردن استرینگ داده شده

متد limit: حذف بیشتر از چند کاراکتر

Str::limit() از رشته‌ی اصلی تعداد n کاراکتر را که به عنوان آرگومان دوم به آن داده‌ایم بر‌می‌گرداند. به جای قسمت حذف شده یا ... می‌گذارد و یا مقداری که در آرگومان سوم ارسال کرده‌ایم را قرار می‌دهد.

use Illuminate\Support\Str;
 
$result = Str::limit('123456789', 5);
// 12345...
 
$result = Str::limit('123456789', 5, ' and more');
// 12345 and more

متد words: حذف بیشتر از چند کلمه

Str::words() تعداد n کلمه _ که در آرگومان دوم مشخص شده است _ از استرینگ اصلی را بر‌می‌گرداند. به جای قسمت حذف شده یا ... قرار می‌گیرد و یا مقداری که به عنوان آرگومان سوم به متد ارسال کرده‌ایم.

use Illuminate\Support\Str;
 
$result = Str::words('Che roozagare ajibi shode. hich chiz sare jash nist', 3);
// Che roozagare ajibi...
 
$result = Str::words('Che roozagare ajibi shode. hich chiz sare jash nist', 3, '... Bikhiyal hosele nadaram.');
// Che roozagare ajibi... Bikhiyal hosele nadaram.

متد excerpt: حذف قبل و بعد

متد Str::excerpt() ابتدا اولین رخداد substring که به عنوان آرگومان دوم به متد ارسال کرده‌ایم را پیدا می‌کند. سپس شعاع یا radius که آن را در آرایه‌ای به عنوان آرگومان سوم به متد فرستاده‌ایم را می‌خواند و سپس از نقطه‌ی radius کاراکتر قبل از رخداد substring تا ‌radius کاراکتر بعد از پایان substring را بر می‌گرداند. به جای ابتدا و انتهای حذف شده ... و یا مقدار فراهم شده در کلید omission از آرایه‌ی آرگومان سوم را قرار می‌دهد.

اگر radius را به متد ندهیم به صورت پیش‌فرض آن را ۱۰۰ در نظر می‌گیرد.

use Illuminate\Support\Str;
 
$result = Str::excerpt('12345678901112131415161718192021222324252627282930', '171819', ['radius' => 5]);
// ...4151617181920212...
 
$result = Str::excerpt('12345678901112131415161718192021222324252627282930', '171819', ['radius' => 5, 'omission' => '(...)']);
// (...)4151617181920212(...)
 
$result = Str::excerpt('Man mohsen hastam. Mohsen dar tehran zendegi mikonad', 'Mohsen', ['radius' => 5, 'omission' => '(...)']);
// Man mohsen hast(...)

گرفتن substring از استرینگ اصلی

گرفتن substring از ابتدا و انتها

متد take: گرفتن substring از ابتدا و انتها

متد Str::take() به عنوان آرگومان دوم طول رشته‌ای را می‌گیرد که باید از ابتدا یا انتهای استرینگ اصلی برگرداند. اگر این آرگومان مثبت باشد substring از ابتدا و اگر منفی باشد از انتهای استرینگ اصلی برگردانده می‌شود.

use Illuminate\Support\Str;
 
$result = Str::take('123456789', 5);
// 12345
 
$result = Str::take('123456789', -5);
// 56789

گرفتن substring از هر جا؛ با اندیس شروع و طول مشخص یا پایان مشخص

متد substr

با متد Str::substr() می‌توان substring ای از اندیس مشخص و به طول مشخص از استرینگ اصلی استخراج کرد. اگر آرگومان دوم یعنی اندیس شروع substring منفی باشد نقطه‌ی شروع را از انتهای استرینگ اصلی محاسبه می‌کند و اگر آرگومان سوم یعنی طول رشته منفی باشد این جا دیگر معنی طول رشته نمی‌دهد بلکه به معنای اندیس پایان substring نسبت به انتهای استرینگ اصلی است.

توجه به این نکته مفید است که اندیس‌ها نسبت به آغاز استرینگ از 0 و نسبت به پایان استرینگ از -1 شروع می‌شوند.

use Illuminate\Support\Str;
 
echo Str::substr('0123456789', 4, 3);
// 456
 
echo Str::substr('0123456789', -8, 3);
// 234
 
echo Str::substr('0123456789', 4, -3);
// 456
 
echo Str::substr('0123456789', -8, -3);
// 23456

گرفتن substring: قبل، بعد، وسط

متد before

متد Str::before() به عنوان آرگومان دوم یک substring از استرینگ اصلی را می‌گیرد و هر چه که قبل از اولین رخداد این substring در استرین اصلی وجود دارد را بر می‌گرداند.

use Illuminate\Support\Str;
 
echo Str::before('0123456789-0123456789', '456');
// 0123
 
echo Str::before('My name is Mohsen', 'Mohsen');
// My name is
 
echo Str::before('My name is Mohsen. I have a freind whose name is Mohsen', 'Mohsen');
// My name is
 
echo Str::before('What is your name?', 'Ali');
// What is your name?

در مثال آخر می‌بینید که چنانچه اگر substring در استرینگ اصلی وجود نداشته باشد، متد کل استرینگ اصلی را برمی‌گرداند.

متد beforeLast

Str::beforeLast() آنچه که قبل از آخرین رخداد substring وارد شده در آرگومان دوم واقع شده است را برمی‌گرداند؛ بر خلاف متد Str::before() که متن قبل از اولین رخداد substring را بر‌می‌گرداند.

use Illuminate\Support\Str;
 
echo Str::beforeLast('0123456789-0123456789', '456');
// 0123456789-0123
 
echo Str::beforeLast('0123456789-0123456789', 'ali');
// 0123456789-0123456789

مشاهده می‌کنید که همانند Str::before() اگر substring در استرینگ اصلی نباشد این متد هم کل استرینگ اصلی را برمی‌گرداند.

متد after

Str::after() هر آنچه را که در استرینگ اصلی بعد از اولین رخداد substring وارد شده در آرگومان دوم قرار گرفته است را برمی‌گرداند. اگر substring در استرینگ اصلی وجود نداشته باشد مانند تمام متدهای این خانواده کل استرینگ اصلی سالم و دست نخورده برگشت داده می‌شود.

use Illuminate\Support\Str;
 
echo Str::after('0123456789-0123456789', 123);
// 456789-0123456789
 
echo Str::after('0123456789-0123456789', 'ali reza');
// 0123456789-0123456789

متد afterLast

متد Str::afterLast() هر آنچه را که بعد از آخرین رخداد substring وارد شده به عنوان آرگومان دوم در استرینگ اصلی قرار گرفته باشد را بر‌می‌گرداند. مانند تمام متدهای این خانواده، این متد نیز چنانچه substring در استرینگ اصلی وجود نداشته باشد کل استرینگ اصلی را برمی‌گرداند.

use Illuminate\Support\Str;
 
echo Str::afterLast('0123456789-0123456789', '345');
// 6789
 
echo Str::afterLast('0123456789-0123456789', 'ali reza amini');
// 0123456789-0123456789

متد between

متد Str::between() هر آنچه را که در استرینگ اصلی مابین اولین رخداد substring اول و آخرین رخداد substring دوم قرار گرفته باشد را برمی‌گرداند. به عبارت دیگر این متد کاملا حریصانه عمل می‌کند و همیشه بزرگترین رشته‌ای را که بتواند انتخاب می‌کند.

این موارد را نیز در نظر داشته باشید:

  • اگر substring اول در استرینگ اصلی نباشد از ابتدا تا محل آخرین رخداد substring دوم برگشت داده می‌شود.
  • اگر substring دوم در استرینگ اصلی موجود نباشد از بعد از اولین رخداد substring اول تا انتهای استرینگ اصلی را بر‌می‌گرداند.
  • اگر هر دو substring ناموجود باشند کل استرینگ اصلی برمی‌گردد.

تمام آنچه گفته شد را در کد زیر مشاهده می‌کنید:

use Illuminate\Support\Str;
 
echo Str::between('0123456789-0123456789-0123456789', '234', '789');
// 56789-0123456789-0123456
 
echo Str::between('0123456789-0123456789-0123456789', 'ali', '789');
// 0123456789-0123456789-0123456
 
echo Str::between('0123456789-0123456789-0123456789', '234', 'ali');
// 56789-0123456789-0123456789
 
echo Str::between('0123456789-0123456789-0123456789', 'mohsen', 'ali');
// 0123456789-0123456789-0123456789

متد betweenFirst

Str::betweenFirst() مشابه متد Str::between() است با این تفاوت که حریص نیست. هر آنچه را که بین اولین رخداد substring اول و اولین رخداد substring دوم قرار گرفته باشد را برمی‌گرداند.

این موارد را نیز در نظر داشته باشید:

  • اگر substring اول در استرینگ اصلی نباشد از ابتدا تا محل اولین رخداد substring دوم برگشت داده می‌شود.
  • اگر substring دوم در استرینگ اصلی موجود نباشد از بعد از اولین رخداد substring اول تا انتهای استرینگ اصلی را بر‌می‌گرداند.
  • اگر هر دو substring ناموجود باشند کل استرینگ اصلی برمی‌گردد.

تمام آنچه گفته شد را در کد زیر مشاهده می‌کنید:

use Illuminate\Support\Str;
 
echo Str::betweenFirst('0123456789-0123456789-0123456789', '234', '789');
// 56
 
echo Str::betweenFirst('0123456789-0123456789-0123456789', 'ali', '789');
// 0123456
 
echo Str::betweenFirst('0123456789-0123456789-0123456789', '234', 'ali');
// 56789-0123456789-0123456789
 
echo Str::betweenFirst('0123456789-0123456789-0123456789', 'mohsen', 'ali');
// 0123456789-0123456789-0123456789

تغییر شکل دادن استرینگ

متد apa

Str::apa() استرینگ ورودی را بر مبنای دستورالعمل‌های APA به فرم Title Case تبدیل می‌کند.

use Illuminate\Support\Str;
 
echo Str::apa('I have a dog');
// I Have a Dog
 
echo Str::apa('The quick brown fox jumps over the lazy dog')
// The Quick Brown Fox Jumps Over the Lazy Dog

متد ascii: تبدیل یک string به رشته‌ای از کاراکترهای ascii

با متد Str::ascii() می‌توان یک رشته که شامل کاراکترهای غیر اسکی است را به رشته‌ای با کاراکترهای تمام اسکی تبدیل کرد. رشته‌ی حاصل معنی بدهد یا ندهد بحث دیگری است!

use Illuminate\Support\Str;
 
$text = Str::ascii('Pouvez-vous répéter s’il vous plaît?');
// Pouvez-vous repeter s'il vous plait?

متد slug

Str::slug() یک استرینگ Url freindly از استرینگ اصلی می‌سازد.

use Illuminate\Support\Str;
 
echo Str::slug('welcmoe to my website');
// welcmoe-to-my-website
 
echo Str::slug("WHaT arE you Doing?");
// what-are-you-doing
 
echo Str::slug("AreYouReady");
// areyouready
 
echo Str::slug("areYouReady");
// areyouready
 
echo Str::slug("this_was_snake_case");
// this-was-snake-case

متدهای بر مبنای پوزیشن

متد charAt

با متد Str::charAt() می‌توان کاراکتر واقع در اندیس مشخص شده را به دست آورد. اگر عدد، مثبت باشد آن را نسبت به ابتدا و اگر منفی باشد نسبت به انتهای استرینگ محاسبه می‌کند. اگر اندیس نامعتبر باشد یعنی در محدوده‌ی طول رشته (چه مثبت و چه منفی) نباشد، متد false برمی‌گرداند.

use Illuminate\Support\Str;
 
echo Str::charAt('Mohsen', 2);
// h
 
echo Str::charAt("Mohsen", -2);
// e
 
$result = Str::charAt("Mohsen", 15);
// false

متد position: یافتن اندیس اولین رخداد یک substring در استرینگ اصلی

با متد Str::position() می‌توان اندیس اولین رخداد یک substring (که توسط آرگومان دوم فراهم می‌شود) را در استرینگ اصلی پیدا کرد. اگر substring در استرینگ اصلی ناموجود باشد متد مقدار false بر‌می‌گرداند.

use Illuminate\Support\Str;
 
echo Str::position('0123456789-01234567890', '345');
// 3
 
Str::position('0123456789-0123456789', '432');
// false

signular/ plural

متد plural

Str::plural() فرم جمع یا plural استرینگ داده شده را بر‌می‌گرداند. این متد فقط در مورد زبانهایی که توسط Laravel Pluralizer پشتیبانی می‌شوند کارایی دارد. به عنوان آرگومان دوم می‌شود به آن یک عدد داد. اگر عدد 1 باشد فرم Singular و اگر عدد 0 و یا بیشتر از 1 باشد فرم Plural را برمی‌گرداند.

use Illuminate\Support\Str;
 
echo Str::plural('child');
// echo Str::plural('child');
 
echo Str::plural('person');
// people
 
echo Str::plural('foot', 0);
// feet
 
echo Str::plural('foot', 1);
// foot
 
echo Str::plural('foot', 2);
// feet

متد pluralStudly

متد Str::pluralStudly() استرینگی را که به فرم StudyCase فرمت‌بندی شده است را به همین فرمت به شکل plural در‌می‌آورد. به مانند متد Str::plural() این متد نیز به عنوان آرگومان دوم می‌تواند یک عدد بگیرد. اگر 1 باشد فرم Singular و اگر 0 یا بیشتر از 1 باشد فرمت Plural StudlyCase استرینگ را بر‌می‌گرداند.

این متد نیز همانند متد Str::plural() فقط در مورد زبانهایی که توسط Laravel Pluralizer پشتیبانی می‌شوند کارایی دارد.

use Illuminate\Support\Str;
 
echo Str::pluralStudly("SpiderMan");
// SpiderMen
 
echo Str::pluralStudly("NotificationEmail", 19);
// NotificationEmails
 
echo Str::pluralStudly('HumanRight', 3);
// HumanRights

⚠ به نظر من متد زیاد قدرتمندی نیست. شاید بعدها نظرم تغییر کند.

متد singular

Str::singular() فرم singular استرینگ وارد شده را برمی‌گرداند. این متد نیز مانند دو متد فوق در مورد زبان‌هایی که توسط Laravel Pluralizer پشتیبانی می‌شوند کارایی دارد.

use Illuminate\Support\Str;
 
echo Str::singular('people');
// person

کار با white space ها

متد squish

متد Str::squish() تمام white spaceها و \n ها و تمام کاراکترهای غیر‌ اصیل را از ابتدا و انتها و میانه‌ی استرینگ حذف می‌کند.

شاید با ذکر یک مثال بیشتر متوجه عملکرد این متد شوید.

use Illuminate\Support\Str;
 
echo Str::squish(" \t man \t\nmnb");
// man mnb
 
echo Str::squish(" \t \tman\ \t \n too \n");
// man\ too

متد trim

⚠ این متد در لاراول ‍‍۱۱ در دسترس است.

متد Str::trim() تمامی white space ها به شمول \n را از ابتدا و انتهای استرینگ حذف می‌کند.

use Illuminate\Support\Str;
 
echo Str::trim("\n\n \t salam \t\n\n\t ");
// salam
 
echo Str::trim("\n\n \t ajab \n\n\t...test");
/* ajab
 
...test
*/

متد ltrim

⚠ این متد در لاراول ‍‍۱۱ در دسترس است.

متد Str::ltrim() تمامی white space ها به شمول \n را از سمت چپ استرینگ حذف می‌کند.

use Illuminate\Support\Str;
 
echo Str::ltrim("\n \t \n\n man \t\t\t");
// man ⏎
 
echo Str::ltrim("\n \t \n\n man \t\t\t man2");
// man man2

متد rtrim

⚠ این متد در لاراول ‍‍۱۱ در دسترس است.

متد Str::rtrim() تمامی white space ها به شمول \n را از سمت راست استرینگ حذف می‌کند.

use Illuminate\Support\Str;
 
$result = Str::rtrim("\n\n\n \t man \n\n\t \t\n");
echo Str::wrap($result, '<', '>');
/*
<
 
 
man>
*/

Markdown

متد inlineMarkdown

متد Str::inlineMarkdown() استرینگ داده شده که باید منطبق با GitHub flavored Markdown باشد را به HTML تبدیل می‌کند. این متد خروجی را عینا بر‌می‌گرداند و آن را در هیچ تگی wrap نمی‌کند.

use Illuminate\Support\Str;
 
echo Str::inlineMarkdown('<i>"italic"</i> **bold**');
// <i>"italic"</i> <strong>bold</strong>
 
echo Str::inlineMarkdown("<i>'italic'</i> **bold**");
// <i>'italic'</i> <strong>bold</strong>

هنگام تبدیل markdown ارسالی توسط کاربر بسیار محتاط باشید. در مثال بالا می‌بینید که کاربر تگ <i>"italic"</i> را وارد کرده است و این تگ عینا در خروجی تکرار شده است. همچنین اگرچه " " کد شده است ولی ' ' بی‌تغییر در خروجی آمده است.

برای ممنوع کردن ارسال تگ HTML توسط کاربر آرایه‌ای را به عنوان آرگومان دوم به متد ارسال می‌کنیم که شامل کلید و مقدار 'html_input' => 'strip' است. این عبارت به متد فرمان می‌دهد که تگ‌های HTML را از خروجی حذف کند و فقط مقدار مابین تگ‌ها را حفظ کند.

use Illuminate\Support\Str;
 
echo Str::inlineMarkdown("<i>'italic'</i> **bold**", ['html_input' => 'strip']);
// 'italic' <strong>bold</strong>

متد markdown

متد Str::markdown() مشابه Str::inlineMarkdown() است و استرینگ داده شده که باید منطبق با GitHub flavored Markdown باشد را به HTML تبدیل می‌کند، با این تفاوت که خروجی را در میان تگ <p></p> قرار می‌دهد.

use Illuminate\Support\Str;
 
echo Str::markdown('<i>"italic"</i> **bold**');
// <p><i>"italic"</i> <strong>bold</strong></p>
 
echo Str::markdown("<i>'italic'</i> **bold**");
// <p><i>'italic'</i> <strong>bold</strong></p>

هنگام تبدیل markdown ارسالی توسط کاربر بسیار محتاط باشید. در مثال بالا می‌بینید که کاربر تگ <i>"italic"</i> را وارد کرده است و این تگ عینا در خروجی تکرار شده است. همچنین اگرچه " " کد شده است ولی ' ' بی‌تغییر در خروجی آمده است.

برای ممنوع کردن ارسال تگ HTML توسط کاربر آرایه‌ای را به عنوان آرگومان دوم به متد ارسال می‌کنیم که شامل کلید و مقدار 'html_input' => 'strip' است. این عبارت به متد فرمان می‌دهد که تگ‌های HTML را از خروجی حذف کند و فقط مقدار مابین تگ‌ها را حفظ کند.

use Illuminate\Support\Str;
 
echo Str::markdown("<i>'italic'</i> **bold**", ['html_input' => 'strip']);
// <p>'italic' <strong>bold</strong></p>

جایگزینی‌ها

متد replace

متد Str::replace() تمام رخداد‌های یک استرینگ را با یک استرینگ دیگر جایگزین می‌کند. به صورت پیش‌فرض عملیات یافتن استرینگ جهت جایگزینی به صورت case sensitive انجام می‌شود ولی با وارد کردن caseSensitive: false در هنگام فراخوانی متد می‌توان تمام رخدادها رافارغ از حروف بزرگ یا حروف کوچک جایگزین کرد.

use Illuminate\Support\Str;
 
echo Str::replace('the', 'THE', 'the cat jumps over the dog');
// THE cat jumps over THE dog
 
echo Str::replace('the', 'THE', 'ThE cat jumps over THe dog');
// ThE cat jumps over THe dog
 
echo Str::replace('the', 'THE', 'ThE cat jumps over THe dog', caseSensitive: false);
// THE cat jumps over THE dog

در مثال دوم هیچ جایگزینی‌ای صورت نگرفته است برای اینکه جایگزینی به صورت case sensitive انجام می‌شود. در مثال سوم با وارد کردن caseSensitive: false به لاراول می‌فهمانیم که در جایگزینی کوچکی و بزرگی حروف مهم نیست.

متد replaceFirst

Str::replaceFirst() فقط و فقط اولین رخداد یک استرینگ را با استرینگ دیگری جایگزین می‌کند و استرینگ حاصل را برمی‌گرداند. عملیات یافتن به صورت case sensitive انجام می‌شود.

use Illuminate\Support\Str;
 
echo Str::replaceFirst('1', '<1>', '123-123-123');
// <1>23-123-123
 
echo Str::replaceFirst('the', 'THE', 'The cat jumps over The dog');
// The cat jumps over The dog

در مثال آخر به علت case sensitive بودن عملیات یافتن استرینگ، هیچ جایگزینی‌ای صورت نگرفته است.

متد replaceLast

متد Str::replaceLast() آخرین رخداد یک استرینگ را با استرینگ دیگر جایگزین می‌کند. عملیات یافتن به صورت case sensitive انجام می‌شود.

use Illuminate\Support\Str;
 
echo Str::replaceLast('3', '<3>', '123-123-123');
// 123-123-12<3>
 
echo Str::replaceLast('The', 'THE', 'the cat jumps over the dog');
// the cat jumps over the dog

در مثال آخر چون The به همین صورت و به همین case یافت نشده‌ است لذا هیچ جایگزینی‌ای نیز صورت نگرفته است.

متد replaceStart

متد Str::replaceStart() یک استرینگ را فقط و فقط زمانی که آن استرینگ در ابتدای استرینگ اصلی واقع شده باشد با استرینگ دیگری جایگزین می‌کند. با کمی دقت می‌توان دریافت که این متد به نوعی Str::replaceFirst() را در درون خود دارد به علاوه‌ی این شرط که اولین رخداد لزوما باید در ابتدای استرینگ اصلی واقع شده باشد.

use Illuminate\Support\Str;
 
echo Str::replaceStart('1', '<1>', '123-123-123');
// <1>23-123-123
 
echo Str::replaceStart('3', '<3>', '123-123-123');
// 123-123-123
 
echo Str::replaceStart('9', '<9>', '123-123-123');
// 123-123-123

متد replaceEnd

متد Str::replaceEnd() در واقع تلفیقی از متد Str::replaceLast() به علاوه‌ی یک شرط مهم است و آن شرط این است که آخرین رخداد استرینگ باید دقیقا در آخر استرینگ اصلی قرار گرفته باشد.

use Illuminate\Support\Str;
 
echo Str::replaceEnd('23', '<23>', '123-123-123');
// 123-123-1<23>
 
echo Str::replaceEnd('12', '<12>', '123-123-123');
// 123-123-123

متد replaceMatches

در متد Str::replaceMatches() بجای این که صراحتا یک استرینگ بگیرد تا آن را با استرینگ دیگری جایگزین کند یک regular expression می‌گیرد. روند کار ساده است. مثال‌های زیر را ببینید.

use Illuminate\Support\Str;
 
echo Str::replaceMatches('/1[^-]*3/','[]', '123-1234-1256-123456');
// []-[]4-1256-[]456
 
echo Str::replaceMatches('/.a.a/', '[DELETED]', 'man va sara va dara be koh raftim');
// man va [DELETED] va [DELETED] be koh raftim
 
echo Str::replaceMatches('/.a.a/', '[DELETED]', 'man va sAra va dara be koh raftim');
// man va sAra va [DELETED] be koh raftim
 
echo Str::replaceMatches('/.a.a/i', '[DELETED]', 'man va sAra va dara be koh raftim');
// man va [DELETED] va [DELETED] be koh raftim
 
echo Str::replaceMatches('/.a.a/i', '[\0]', 'man va sara va dara be koh raftim');
man va [sara] va [dara] be koh raftim

می‌توان به این متد به عنوان آرگومان دوم یک Closure ارسال کرد. ورودی این تابع آرایه‌ای از موارد یافته شده و آماده‌ی جایگزینی است.

use Illuminate\Support\Str;
 
echo Str::replaceMatches('/.a.a/', function (array $matches) {
return strtoupper($matches[0]);
}, 'man va sara va dara be koh raftim');
 
// man va SARA va DARA be koh raftim

📝 برای درک بهتر این متد، مستندات تابع preg_replace را مطالعه کنید.

متد replaceArray

متد Str::replaceArray() رخدادهای یک استرینگ را به ترتیب با عناصر یک آرایه جایگزین می‌کند.

use Illuminate\Support\Str;
 
echo Str::replaceArray('?', ['Sara', 'Dara'], 'man va ? va ? be koh raftim');
// man va Sara va Dara be koh raftim
 
echo Str::replaceArray('#', [1, 2, 3], 'arg# & arg# & arg# & arg#');
// arg1 & arg2 & arg3 & arg#

در مثال آخر می‌بینید که عملیات جایگزینی بعد از به کار رفتن آخرین عنصر آرایه متوقف می‌شود.

متد substrReplace

Str::substrReplace() احتمالا یکی از مفیدترین متدهای این کلاس است. نحوه کار این متد را با دو سناریوی زیر توضیح می‌دهیم:

  • اگر با سه آرگومان فراخوانده شود یک اندیس را به عنوان آرگومان سوم می‌گیرد و از آن اندیس تا انتهای استرینگ اصلی را پاک می‌کند و سپس استرینگ داده شده به عنوان آرگومان دوم را به انتهای آن اضافه می‌کند.
  • اگر با چهار آرگومان فراخوانده شود از اندیس وارد شده به عنوان آرگومان سوم به تعداد آرگومان چهارم از استرینگ اصلی را حذف می‌کند و سپس در گپ حاصل استرینگ داده شده به عنوان آرگومان دوم را قرار می‌دهد.

👌 واضح است که اگر آرگومان چهارم 0 باشد هیچ جزئی از استرینگ اصلی حذف نمی‌شود و فقط استرینگ داده شده به عنوان آرگومان دوم در اندیس وارد شده به عنوان آرگومان سوم در استرینگ اصلی قرار می‌گیرد.

اجرای کد از توضیحات آن ساده‌تر است!

use Illuminate\Support\Str;
 
echo Str::substrReplace('123456', ':', 2);
// 12:
 
echo Str::substrReplace('123456', ':', 2, 2);
12:56
 
echo Str::substrReplace('123456', ':', 2, 0);
12:3456

متد swap

متد Str::swap() یک آرایه شامل کلید/ مقدار را به عنوان آرگومان اول می‌گیرد و در سپس استرینگ اصلی که به عنوان آرگومان دوم وارد شده است جای کلید، مقدار را قرار می‌دهد.

use Illuminate\Support\Str;
 
echo Str::swap([
':name' => 'mohsen',
':age' => '42',
':city' => 'tehran',
], ':name, :age darad va dar :city zendegi mikonad.')
 
// mohsen, 42 darad va dar tehran zendegi mikonad.

ایجاد Uuid

متد uuid

با متد Str::uuid() می‌توان یک UUID نسخه‌ی ۴ تولید کرد.

use Illuminate\Support\Str;
 
echo Str::uuid();
// 058bab4c-dee8-4a5b-9dc2-97da4860d505
 
echo Str::uuid();
// 82184b91-3389-4bc7-b60d-c8329423f38d

متد createUuidsUsing: تولید UUID با استفاده از Closure دلخواه

گاهی اوقات مثلا در فرآیند تست نرم‌افزار لازم است که منطق تولید UUID در دست خودمان باشد؛ مثلا در هنگام نیاز متد Str::uuid() همیشه یک کد برگرداند. در این مواقع از متد Str::createUuidsUsing() استفاده می‌کنیم. این متد به عنوان تنها آرگومان ورودی یک Closure می‌گیرد که باید یک کد UUID برگرداند.

use Illuminate\Support\Str;
use Ramsey\Uuid\Uuid;
 
echo Str::uuid();
// 5c12c356-cc5a-4432-8f8e-48241bc15116
 
echo Str::uuid();
// d1ab8cf4-f3a3-4565-a7b4-201dbbdc128d
 
Str::createUuidsUsing(function () {
return Uuid::fromString('eadbfeac-5258-45c2-bab7-ccb9b5ef74f9');
});
 
echo Str::uuid();
// eadbfeac-5258-45c2-bab7-ccb9b5ef74f9
 
echo Str::uuid();
// eadbfeac-5258-45c2-bab7-ccb9b5ef74f9

در دو مثال اول با هر بار فراخوانی Str::uuid() یک کد uuid منحصر به فرد دریافت می‌کنیم ولی بعد از فراخوانی متد Str::createUuidsUsing() با Closure وارد شده که همیشه یک uuid بر‌می‌گرداند این بار بر خلاف گذشته متد Str::uuid() دیگر فقط همان uuid تکراری را بر‌می‌گرداند.

متد createUuidsNormally: بازگرداندن منطق تولید uuid به حالت طبیعی

اما بعد از استفاده از Str::createUuidsUsing() گاهی اوقات لازم است منطق تولید کد uuid به حالت طبیعی بازگردد. این کار با استفاده از متد Str::createUuidsNormally() انجام می‌شود. این متد هیچ پارامتری ندارد.

use Illuminate\Support\Str;
use Ramsey\Uuid\Uuid;
 
Str::createUuidsUsing(function () {
return Uuid::fromString('eadbfeac-5258-45c2-bab7-ccb9b5ef74f9');
});
 
echo Str::uuid();
// eadbfeac-5258-45c2-bab7-ccb9b5ef74f9
 
echo Str::uuid();
// eadbfeac-5258-45c2-bab7-ccb9b5ef74f9
 
Str::createUuidsNormally();
 
echo Str::uuid();
// 8dfde703-4621-4924-a3b8-2922479655a1
 
echo Str::uuid();
// 9307346c-2bbe-498e-acdd-eae5cad45f9e

ایجاد ulid

متد ulid

با متد Str::ulid() می‌توان یک کد ulid تولید کرد.

use Illuminate\Support\Str;
 
echo Str::ulid();
// 01HVDTMDCZT2BSS3929HHV6X0W
 
echo Str::ulid();
// 01HVDTN3GK2HVN3RH3K2TZF98E

ulid اطلاعات زمان تولیدش را در خود نگه‌داری می‌کند برای بازیابی این اطلاعات به شیوه‌ی زیر عمل می‌کنیم.

use Illuminate\Support\Str;
use Illuminate\Support\Carbon;
 
$ulid = '01gd6r360bp37zj17nxb55yv40';
$date = Carbon::createFromId($ulid);
 
echo $data;
/*
Illuminate\Support\Carbon @1663452682 {#5134
date: 2022-09-17 22:11:22.251 +00:00,
}
*/

متد createUlidsUsing: رجیستر کردن تابع دلخواه برای تولید کد ulid

مانند متدهای مربوط به uuid در سری متدهای ulid هم متدی جهت کنترل نحوه‌ی تولید کد ulid توسط متد Str::ulid() وجود دارد. با Str::createUlidsUsing() می‌توان یک closure را رجیستر کرد که در پشت صحنه با هر بار فراخوانی Str::ulid() فراخوانده شود و وظیفه‌اش برگرداندن کد ulid باشد.

use Illuminate\Support\Str;
use Symfony\Component\Uid\Ulid;
 
echo Str::ulid();
// 01HVDWMWNEV93D777TRZVK49XQ
 
echo Str::ulid();
// 1HVDWNJG8CP9H3DZTG5QGW8GQ
 
Str::createUlidsUsing(function () {
return new Ulid('01HRDBNHHCKNW2AK4Z29SN82T9');
});
 
echo Str::ulid();
// 01HRDBNHHCKNW2AK4Z29SN82T9
 
echo Str::ulid();
// 01HRDBNHHCKNW2AK4Z29SN82T9

در مثال‌های بالا ملاحظه می‌فرمایید که بعد از رجیستر کردن یک closure در هر بار فراوانی متد Str::ulid() کد ulid فراهم شده توسط closure برگردانده می‌شود.

متد createUlidsNormally: برگرداندن منطق تولید کد ulid به حالت پیش‌فرض

همانطور که دیدیم بعد از رجیستر کردن یک تابع توسط متد Str::createUlidsUsing() در پشت صحنه متد Str::ulid() آن تابع را فراخوانده و کد برگشتی آن را به عنوان نتیجه‌ی متد برگشت می‌دهد. اما گاهی اوقات لازم است که این زنجیره را قطع کنیم و متد Str::ulid() شخصا و بدون نیاز به هیچ تابع ثانویه‌ای کد ulid را تولید کند. با متد Str::createUlidsNormally() می‌توان روند تولید کدهای ulid را به حالت طبیعی برگرداند.

use Illuminate\Support\Str;
use Symfony\Component\Uid\Ulid;
 
Str::createUlidsUsing(function () {
return new Ulid('01HRDBNHHCKNW2AK4Z29SN82T9');
});
 
echo Str::ulid();
// 01HRDBNHHCKNW2AK4Z29SN82T9
 
echo Str::ulid();
// 01HRDBNHHCKNW2AK4Z29SN82T9
 
Str::createUlidsNormally();
 
echo Str::ulid();
// 01HVDXBZ0YB5XWE0G7DR65R51K
 
echo Str::ulid();
// 01HVDXCCHMNQQ756ST3ZRS07VG

به نظر می‌رسد که همه چیز به حالت طبیعی برگشته است!

پایان مطلب و نتیجه‌گیری

این مطلب مفصل و پُر توضیح و پُر مثال این جا به پایان می‌رسد. می‌توانید توضیحات سایت لاراول برای کلاس Illuminate\Support\Str را اینجا بخوانید. اگر چه شاکله‌ی مطلب من برگرفته از همین توضیحات است ولی دسته‌بندی متدها را برای فهم و راحت در ذهن نشستن مطلب تغییر اساسی دادم. توضیحات بیشتری ارائه دادم و جزئیاتی که به ذهنم می‌رسید و در سایت فوق به آن اشاره‌ای نشده بود را هم اضافه بر توضیحات کردم و به جز دو یا سه مورد خاص مثال‌های خود را ارائه دادم. به طور خلاصه بگویم که خویش را قانع کردم که نوشتن یادداشتی به چنین مفصلی در کنار توضیحات خوب سایت لاراول خالی از فایده نیست.

امیدوارم پس از خواندن این پست نظر هم نظر باشیم.

نوشته شده در: 1403-01-26 (7 ماه 6 روز 12 ساعت پیش)

من محسن هستم؛ برنامه‌نویس سابق PHP و Laravel و Zend Framework و پایتون و فلسک. تمرکزم بیشتر روی لاراول بود! الان از صفر مشغول مطالعات اقتصادی هستم.

برای ارتباط با من یا در همین سایت کامنت بگذارید و یا به dokaj.ir(at)gmail.com ایمیل بزنید.

در مورد این مطلب یادداشتی بنویسید.