فهرست

در این مطلب کلاس Illuminate\Support\Str و متدهای آن در لاراول را بررسی میکنیم. تمام تلاش خود را کردهام تا با طبقهبندی متدها و ارائهی توضیحات شفاف و مثالهای متنوع منبع قابل اتکایی برای مطالعه و مراجعههای مکرر علاقمندان فراهم کنم.
بیائید کار را با بازی با چند متد شروع کنیم.
متد Str::length() طول استرینگ داده شده را بر میگرداند.
use Illuminate\Support\Str;
echo Str::length('123456789');
// 9
با متد Str::wordCount() میتوان تعداد کلمات یک استرینگ را به دست آورد.
use Illuminate\Support\Str;
echo Str::wordCount('I am Mohsen Safari.');
// 4
متد 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
با متد Str::random() میتوان یک استرینگ تصادفی به طول داده شده تولید کرد.
use Illuminate\Support\Str;
echo Str::random(32)
// 5p30EhUg0C1euLnMY41wb7P6AVrj1BoH
با رجیستر کردن یک 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
مشاهده میکنید که در این حالت درخواست ایجاد کلمهی تصادفی به طول ۲ کاراکتر هیچ تاثیری ندارد و عینا مقدار برگشتی از تابع رجیستر شده به عنوان خروجی متد منظور میشود.
بعد از اینکه کارمان در مرحله قبل تمام شد لازم است به لاراول بفهمانیم که از این به بعد استرینگ تصادفی را به شیوهی اولیه خودش تولید کند و نه با استفاده از تابع رجیستر شده. این کار توسط متد Str::createRandomStringsNormally انجام میشود.
use Illuminate\Support\Str;
Str::createRandomStringsUsing(function () {
return 'Alireza Amini';
});
echo Str::random();
// Alireza Amini
Str::createRandomStringsNormally(); // [tl! highlight]
echo Str::random();
// Y8bfGOcjhR06Uub3
با متد Str::wrap() میتوان استرینگ را بین دو استرینگ دیگر محاط کرد.
use Illuminate\Support\Str;
echo Str::wrap('Mohsen', '<', '>');
// <Mohsen>
echo Str::wrap("Mohsen", '"');
// echo Str::wrap("Mohsen", '"');
با متد Str::unwrap() میتوان استرینگهای محاط کننده را از ابتدا و انتهای استرینگ اصلی حذف کرد.
use Illuminate\Support\Str;
echo Str::unwrap('<Mohsen>', '<', '>');
// Mohsen
echo Str::unwrap('"Dar jahan che khabar ast?!"', '"');
// Dar jahan che khabar ast?!
با متد Str::reverse() میتوان استرینگ داده شده را معکوس کرد.
use Illuminate\Support\Str;
echo Str::reverse('Dokaj.com');
// moc.jakoD
با متد Str::repeat()میتوان استرینگ داده شده را به تعداد دلخواه پشت سر هم تکرار کرد.
use Illuminate\Support\Str;
$str = Str::repeat('Salam ', 3);
echo $str;
// Salam Salam Salam
echo Str::wrap($str, '<', '>');
// <Salam Salam Salam >
با متد Str::substrCount() میتوان تعداد وقوع یک زیر رشته در استرینگ اصلی را پیدا کرد.
use Illuminate\Support\Str;
echo Str::substrCount('This is my laptop', 'is');
// 2
همان طور که مشاهده میکنید رشتهی is دو بار در استرینگ اصلی تکرار شده است.
با متد 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 را به عنوان آرگومان سوم به متد فوق ارسال کرد.
گاهی اوقات به عنوان مثال لازم است تعدادی از ارقام شمارهی موبایل را با کاراکتر * پوشاند و نتیجه را در صفحه نمایش داد. این کار توسط متد 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
متد Str::toBase64() استرینگ داده شده را با Base64 کد میکند.
use Illuminate\Support\Str;
echo Str::toBase64('Mohsen');
// TW9oc2Vu
متد 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
متد 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
متد 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
متد 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
متد 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
متد Str::upper() استرینگ ورودی را به طور کامل با حروف بزرگ برمیگرداند.
use Illuminate\Support\Str;
echo Str::upper('My naMe is MohSen SaFari');
// MY NAME IS MOHSEN SAFARI
متد Str::lower() استرینگ ورودی را تماما با حروف کوچک برمیگرداند.
use Illuminate\Support\Str;
echo Str::lower('My naME iS MohsEn safarI');
// my name is mohsen safari
متد Str::ucfirst() اولین کاراکتر استرینگ ورودی را به upper case تبدیل میکند.
use Illuminate\Support\Str;
echo Str::ucfirst('my name is mohsen');
// My name is mohsen
متد Str::lcfirst() اولین کاراکتر استرینگ ورودی را به lower case تبدیل میکند.
use Illuminate\Support\Str;
echo Str::lcfirst('MY NAME IS MOHSEN');
// mY NAME IS MOHSEN
متد 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
متد 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
متد 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.
متد Str::padRight() استرینگ ورودی را در سمت چپ فضای داده شده به طول آرگومان دوم قرار میدهد، سپس فضای خالی در سمت راست استرینگ را _ تا زمانی که طول استرینگ حاصله به طول دلخواه (آرگومان دوم) برسد _ با تکرار کاراکترهایی که توسط آرگومان سوم فراهم شده است پر میکند.
use Illuminate\Support\Str;
echo Str::padRight("My name is Mohsen.", 80, '<');
// My name is Mohsen.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
متد Str::padLeft() استرینگ ورودی را در سمت راست فضای داده شده به طول آرگومان دوم قرار میدهد، سپس فضای خالی در سمت چپ استرینگ را _ تا زمانی که طول استرینگ حاصله به طول دلخواه (آرگومان دوم) برسد _ با تکرار کاراکترهایی که توسط آرگومان سوم فراهم شده است پر میکند.
use Illuminate\Support\Str;
echo Str::padLeft("My name is Mohsen.", 80, '>');
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>My name is Mohsen.
متد Str::padBoth() استرینگ ورودی را در وسط فضای مشخص شده به طول آرگومان دوم قرار میدهد، سپس فضاهای خالی در طرفین استرینگ را _ تا زمانی که طول استرینگ حاصله به طول دلخواه (آرگومان دوم) برسد _ با تکرار کاراکترهایی که توسط آرگومان سوم فراهم شده است پر میکند.
use Illuminate\Support\Str;
echo Str::padBoth('In the name of God', 30, '.:.');
// .:..:.In the name of God.:..:.
متد 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
در متد 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
متد 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
متد 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. ختم میشود.
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 برمیگرداند.
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
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
متد 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
Str::isUlid() بررسی میکند که آیا استرینگ ورودی یک ULID صحیح هست یا نه.
use Illuminate\Support\Str;
$result = Str::isUlid('01ARZ3NDEKTSV4RRFFQ69G5FAV');
// true
$result = Str::isUlid('01G65Z755AFWAKHE12NY0CQ9FH');
// true
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
Str::limit() از رشتهی اصلی تعداد n کاراکتر را که به عنوان آرگومان دوم به آن دادهایم برمیگرداند. به جای قسمت حذف شده یا ... میگذارد و یا مقداری که در آرگومان سوم ارسال کردهایم را قرار میدهد.
use Illuminate\Support\Str;
$result = Str::limit('123456789', 5);
// 12345...
$result = Str::limit('123456789', 5, ' and more');
// 12345 and more
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.
متد 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(...)
متد Str::take() به عنوان آرگومان دوم طول رشتهای را میگیرد که باید از ابتدا یا انتهای استرینگ اصلی برگرداند. اگر این آرگومان مثبت باشد substring از ابتدا و اگر منفی باشد از انتهای استرینگ اصلی برگردانده میشود.
use Illuminate\Support\Str;
$result = Str::take('123456789', 5);
// 12345
$result = Str::take('123456789', -5);
// 56789
با متد 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
متد 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 در استرینگ اصلی وجود نداشته باشد، متد کل استرینگ اصلی را برمیگرداند.
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 در استرینگ اصلی نباشد این متد هم کل استرینگ اصلی را برمیگرداند.
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
متد 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
متد Str::between() هر آنچه را که در استرینگ اصلی مابین اولین رخداد 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
Str::betweenFirst() مشابه متد Str::between() است با این تفاوت که حریص نیست. هر آنچه را که بین اولین رخداد 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
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
با متد 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?
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
با متد 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
با متد Str::position() میتوان اندیس اولین رخداد یک substring (که توسط آرگومان دوم فراهم میشود) را در استرینگ اصلی پیدا کرد. اگر substring در استرینگ اصلی ناموجود باشد متد مقدار false برمیگرداند.
use Illuminate\Support\Str;
echo Str::position('0123456789-01234567890', '345');
// 3
Str::position('0123456789-0123456789', '432');
// false
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
متد 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
⚠ به نظر من متد زیاد قدرتمندی نیست. شاید بعدها نظرم تغییر کند.
Str::singular() فرم singular استرینگ وارد شده را برمیگرداند. این متد نیز مانند دو متد فوق در مورد زبانهایی که توسط Laravel Pluralizer پشتیبانی میشوند کارایی دارد.
use Illuminate\Support\Str;
echo Str::singular('people');
// person
متد 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
⚠ این متد در لاراول ۱۱ در دسترس است.
متد 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
*/
⚠ این متد در لاراول ۱۱ در دسترس است.
متد 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
⚠ این متد در لاراول ۱۱ در دسترس است.
متد 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>
*/
متد 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>
متد 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>
متد 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 به لاراول میفهمانیم که در جایگزینی کوچکی و بزرگی حروف مهم نیست.
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 بودن عملیات یافتن استرینگ، هیچ جایگزینیای صورت نگرفته است.
متد 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 یافت نشده است لذا هیچ جایگزینیای نیز صورت نگرفته است.
متد 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
متد 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
در متد 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 را مطالعه کنید.
متد 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#
در مثال آخر میبینید که عملیات جایگزینی بعد از به کار رفتن آخرین عنصر آرایه متوقف میشود.
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
متد 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.
با متد Str::uuid() میتوان یک UUID نسخهی ۴ تولید کرد.
use Illuminate\Support\Str;
echo Str::uuid();
// 058bab4c-dee8-4a5b-9dc2-97da4860d505
echo Str::uuid();
// 82184b91-3389-4bc7-b60d-c8329423f38d
گاهی اوقات مثلا در فرآیند تست نرمافزار لازم است که منطق تولید 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 تکراری را برمیگرداند.
اما بعد از استفاده از 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
با متد 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,
}
*/
مانند متدهای مربوط به 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 برگردانده میشود.
همانطور که دیدیم بعد از رجیستر کردن یک تابع توسط متد 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 را اینجا بخوانید. اگر چه شاکلهی مطلب من برگرفته از همین توضیحات است ولی دستهبندی متدها را برای فهم و راحت در ذهن نشستن مطلب تغییر اساسی دادم. توضیحات بیشتری ارائه دادم و جزئیاتی که به ذهنم میرسید و در سایت فوق به آن اشارهای نشده بود را هم اضافه بر توضیحات کردم و به جز دو یا سه مورد خاص مثالهای خود را ارائه دادم. به طور خلاصه بگویم که خویش را قانع کردم که نوشتن یادداشتی به چنین مفصلی در کنار توضیحات خوب سایت لاراول خالی از فایده نیست.
امیدوارم پس از خواندن این پست نظر هم نظر باشیم.