بحث های اخیر زبان پی اچ پیدر habré بیشتر به توانایی طراحی سیستم های پیچیده مربوط می شود که خبر خوبی است. با این حال، پس از بررسی ده ها مورد از شناخته شده ترین فریم ورک های وب (Zend Framework، Adept، CakePHP، CodeIgniter، LIMB، Symfony، MZZ و دیگران)، من واقعاً از یافتن برخی کاستی های قابل توجه در زمینه بهینه سازی ابتدایی شگفت زده شدم.

برای اینکه این موضوع از نظر فنی بیشتر شود، نتایج به شکل دقیق تری ارائه شده است که می تواند درک آن را تا حدودی دشوار کند.

بنابراین، بیایید برویم ... کار بسیار ساده است: انجام آزمایش هایی در مورد سرعت تشکیل رشته ها از رشته های فرعی در نقل قول های تک و دوتایی. در اصل، این سوال همچنان مرتبط خواهد بود برای مدت طولانیبه دلیل ویژگی های پردازش رشته در PHP.

مقالات زیادی در مورد بهینه سازی اسکریپت پایه هم به زبان روسی و هم به زبان های دیگر وجود دارد. در مورد رشته ها کم گفته شده است، اما واقعیت "تجزیه" رشته ها در گیومه های دوگانه برای متغیرها و کاراکترهای کنترل ذکر شده است (اما، همانطور که در مستندات رسمی). بر این اساس، منطقی است که فرض کنیم استفاده از رشته های دو گیومه در کار تا حدودی کندتر از عملیات مشابه با رشته های فرعی تک گیومه خواهد بود.

علاوه بر جایگزینی متغیرها به رشته ها و الحاق متغیرها با رشته های فرعی، PHP حداقل یک راه دیگر را برای تشکیل رشته ها پیاده سازی می کند: کار با تابع sprintf. منطقی است که چنین فرض کنیم این روشبه دلیل فراخوانی تابع اضافی و تجزیه رشته در داخل، به طور قابل توجهی از موارد "استاندارد" پایین تر خواهد بود.

تنها مورد اضافه قبل از اینکه کد اسکریپت تست را به شما ارائه کنم: باید 2 را در نظر بگیرید گزینه های ممکنکار با رشته ها در دو گیومه: با در نظر گرفتن سبک کدنویسی ساده و "پیشرفته". این واقعیت که متغیرها در همان ابتدای خطوط هستند احتمالاً ارزش توجه ندارد - آنها فقط نمونه هایی هستند:
$string = "$_SERVER["HTTP_HOST"] اداره منطقه اولیانوفسک نیست. ما عاشق زبان روسی هستیم و کسانی که به آن صحبت می کنند را دوست نداریم..."
و
$string = "($_SERVER["HTTP_HOST"]) اداره منطقه اولیانوفسک نیست. ما عاشق زبان روسی هستیم و کسانی که به آن صحبت می کنند را دوست نداریم..."

تست شماره یک
خوب، به نظر می رسد که تمام رزروها انجام شده است - وقت آن است که نتایج کار را نشان دهیم. منبعتستر را می توان پیدا کرد.

اسکرین شات ها نشان می دهد که فرضیه من تایید نشده است. فرضیه کار با رشته ها از طریق sprintf تنها فرض درستی بود. سریعترین توابعی بودند که با آنها کار می کردند نقل قول های دوگانه.

پس از تأمل کوتاهی در مورد وضعیت، توضیح به خودی خود آمد: کل موضوع این است که رشته مرجعی که جایگزین‌ها در آن انجام شده است بسیار کوتاه است: تجزیه‌کننده‌ای که از چنین رشته‌ای عبور می‌کند، موضوع کوچکی است. با این حال، حتی در اینجا نیز واضح است که جایگزینی بومی یک متغیر به یک رشته، مزیتی نسبت به "سبک پیشرفته" دارد.
این نیز نقطه ضعف رویکرد الحاق است: حجم داده های درج شده از حجم رشته های فرعی بیشتر است. جایی که هزینه های سربار از کجا می آیند را می توان در هابراتوپیک قبلاً ذکر شده بخوانید.

با این حال، حتی این افکار نیز نیاز به تایید داشت. برای این، آزمایش دوم با تغییرات در دلایل احتمالی ذکر شده برای چنین رفتار غیرقابل پیش بینی (برای من) مورد نیاز بود. ظاهراً در نسخه پنجم چیزهای زیادی اصلاح شده است (اعتراف می کنم که در نسخه پنجم php فقط 1 آزمایش انجام دادم: برای دور زدن عناصر آرایه).

تست شماره دو
فرضیه دوم این است که طولانی شدن رشته مرجع در نهایت درصد توابع آزمایشگر مرتبط با تشکیل رشته ها در گیومه های دوگانه را نسبت به نتایج آزمون شماره 1 افزایش می دهد. از نظر تئوری، همین وضعیت باید در رابطه با عملیات رعایت شود. تابع sprintf این پیش از هر چیز به دلیل نیاز به تجزیه رشته و افزایش زمان صرف شده برای آن است. در شرایط به هم پیوستن زیر رشته ها در گیومه های تک، من فکر می کنم که نتیجه تقریباً مشابه آزمایش اول خواهد بود، که باعث کاهش جزئی در نسبت زمان اجرای تابع quotes_3() در زمان می شود. از کل فیلمنامه (اما نه افزایش عملکرد).

نتیجه گیری، در واقع، تنها مثبت و تایید فرضیه است. هنگامی که رشته مرجع کمی افزایش می یابد، بار زیادی ایجاد می شود که منجر به افت عملکرد کوتیشن های دوگانه و توابع sprintf می شود.

فرض در مورد رشته ها در گیومه های تک نیز درست بود: به جای 36.75٪ از زمان در آزمایش اول، در تست دوم، تابع quotes_3 () 33.76٪ از زمان اجرای اسکریپت را گرفت.

ارزش عملی
به زبان ساده، با انتزاع از داده ها، می توان نتیجه گرفت: چه رشته بلندتر، که در آن لازم است جایگزینی انجام شود، احتمال بیشتری وجود دارد که عملیات الحاق سریعتر از جستجوی یک متغیر در گیومه های دوبل تکمیل شود. داوطلبان می توانند سعی کنند پارامترهای درج لازم (تعداد متغیرها، طول رشته مرجع، طول رشته ها در متغیرها) را به گونه ای انتخاب کنند که برابری زمان های اجرا را برآورده کند.

این در واقع همه چیز است. فقط اضافه می شود که هیچ چیز کوچکی در برنامه نویسی وجود ندارد (این برای کسانی است که دوست دارند بگویند "صرفه جویی در مسابقات" (ج) Adelf). با دانستن چنین ظرافت‌هایی و در نظر گرفتن آنها می‌توانید کدی بنویسید که در تمام سطوح آن بهینه شود؛)

PS:
آزمایش‌هایی که با استفاده از Zend Studio For Eclipse 6.0.0 انجام شد (اشکال‌زدا + نمایه‌گر شامل).
PHP نسخه 5.2.5
سیستم عامل لینوکس دبیان

PPS:
خوشحال می شوم اگر کسی نتایج خود را از این آزمایشات ارسال کند. من فکر می کنم این امکان ارزیابی عینی تری از نیاز به استفاده از یک یا آن روش جایگزینی در رشته ها را فراهم می کند. همچنین از انتقاد سالم از سبک ارائه و طراحی سپاسگزار خواهم بود.

(PHP 4، PHP 5، PHP 7)

str_replace- تمام رخدادهای رشته جستجو را با رشته جایگزین جایگزین می کند

شرح

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

اگر به قوانین پیچیده پیدا/جایگزینی (مانند عبارات منظم) نیاز ندارید، این تابع ترجیح داده می شود. preg_replace().

فهرست پارامترها

اگر جستجو و جایگزینی آرایه هستند، پس str_replace()از هر مقدار از آرایه مربوطه برای جستجو و جایگزینی در موضوع استفاده می کند. اگر عناصر کمتری در آرایه جایگزین نسبت به جستجو وجود داشته باشد، رشته خالی به عنوان رشته جایگزین برای مقادیر باقی مانده استفاده می شود. اگر جستجو یک آرایه و جایگزینی یک رشته باشد، آن رشته جایگزین برای هر عنصر آرایه جستجو استفاده خواهد شد. حالت معکوس منطقی نیست

اگر جستجو یا جایگزینی آرایه باشد، عناصر آنها از اول تا آخر پردازش می شوند.

ارزشی که به دنبال آن هستید که به آن نیز معروف است سوزن(سوزن). می توانید از یک آرایه برای چندین مقدار جستجو استفاده کنید.

جایگزین کردن

مقدار جایگزین برای جایگزینی مقادیر جستجوی جستجو شده استفاده خواهد شد. می توانید از یک آرایه برای چندین مقدار استفاده کنید.

موضوع

رشته یا آرایه ای که باید جستجو و جایگزین شود که به آن نیز می گویند انبار کاه(یک پشته یونجه).

اگر موضوع یک آرایه باشد، جستجو و جایگزینی روی هر عنصر موضوع انجام می شود و نتیجه تابع نیز یک آرایه خواهد بود.

در صورت تصویب، به تعداد تعویض های انجام شده تنظیم می شود.

ارزش های بازگشتی

این تابع یک رشته یا آرایه را با مقادیر جایگزین شده برمی گرداند.

مثال ها

مثال شماره 1 مثال های استفاده str_replace()

// اختصاص می دهد
$bodytag = str_replace("%body%" , "سیاه" , " " );

// assign: Hll Wrld f PHP
$vowels = array("a" , "e" , "i" , "o" , "u" , "A" , "E" , "I" , "O" , "U" );
$onlyconsonants = str_replace ($Vowels , "" , "Hello World of PHP" );

// تعیین می کند: شما باید هر روز پیتزا، آبجو و بستنی بخورید
عبارت $= "شما باید هر روز میوه، سبزیجات و فیبر بخورید.";
$healthy = array("میوه ها" , "سبزیجات" , "فیبر" );
$yummy = array("پیتزا" , "آبجو" , "بستنی" );

$newphrase = str_replace ($healthy , $yummy , $phrase );

// اختصاص دادن: 2
$str = str_replace ("ll" , "" , "گلی خوب خانم مولی!" , $count );
echo $count ;
?>

مثال شماره 2 نمونه هایی از ترفندهای بالقوه با str_replace()

// سفارش تعویض
$str = "خط 1\nخط 2\rخط 3\r\nخط 4\n";
$order = array("\r\n" , "\n" , "\r" );
$replace = "
" ;

// ابتدا \r\n را دستگیر کنید تا از تعویض مجدد آنها جلوگیری کنید.
echo $newstr = str_replace ($order , $replace , $str );

// خروجی F، زیرا A با B، سپس B با C، و غیره جایگزین می شود.
// در نتیجه، E با F جایگزین می شود، زیرا جایگزینی از چپ به راست انجام می شود.
$search = array("A" , "B" , "C" , "D" , "E" );
$replace = array("B" , "C" , "D" , "E" , "F" );
$subject = "A" ;
echo str_replace ($search، $replace، $subject);

// خروجی ها: سیب، مهره، مهره (به دلیل بالا)
$letters = array("I" , "o" );
$fruit = array("apple" , "nut" );
$text = "من در مورد" ;
$output = str_replace ($letters، $fruit، $text);
echo $output ;
?>

یادداشت

اظهار نظر: این تابع برای مدیریت داده ها به شکل باینری ایمن است.

هشدار

توجه به سفارش تعویض

زیرا str_replace()از چپ به راست جایگزین می شود، سپس هنگام استفاده از چندین جایگزین، می تواند یک مقدار درج شده قبلی را با مقدار دیگری جایگزین کند. همچنین نمونه هایی را در این صفحه ببینید.

اظهار نظر:

این تابع به حروف بزرگ و کوچک حساس است. استفاده کنید str_place()برای جایگزینی بدون حروف کوچک.

اظهار نظر: در PHP 7.0.0 بر روی پلتفرم های 64 بیتی محدودیتی برای طول رشته وجود ندارد، در سیستم های 32 بیتی و نسخه های قبلی PHP، رشته ها نمی توانند بزرگتر از 2 گیگابایت (2147483647 بایت) باشند.

نحو

یک رشته را می توان با چهار تعریف کرد روش های مختلف:

  • نقل قول های تک
  • نقل قول های دوگانه
  • نحو nowdoc (از PHP 5.3.0)

نقل قول های تک

ساده ترین راهتعریف رشته به معنای محصور کردن آن در گیومه های تک است (نماد " ).

برای استفاده از یک نقل قول منفرد در یک رشته، از آن با یک اسلش فرار کنید ( \ ). اگر نیاز به نوشتن خود اسلش دارید، آن را کپی کنید ( \\ ). تمام بک اسلش های دیگر به عنوان کاراکترهای معمولی تفسیر می شوند، به این معنی که اگر سعی کنید از دنباله های فرار دیگری مانند \rیا \n، آنها به جای هر رفتار خاصی، همانطور که هست خروجی خواهند داشت.

اکو "این یک رشته ساده است";

اکو "همچنین، می توانید در خطوط وارد کنید
شخصیت خط جدید مانند این،
این طبیعی است"
;

// خروجی ها: یک روز آرنولد گفت: "من برمی گردم"
اکو "یک روز آرنولد گفت "من برمی گردم";

اکو "C:\\*.* را حذف کردی؟";

// خروجی ها: C:\*.* را حذف کردید؟
echo "C:\*.* را حذف کردی؟" ;

// خروجی: این گسترش نخواهد یافت: \n خط جدید
اکو "این گسترش نخواهد یافت: \n خط جدید";

// چاپ: متغیرهای $expand نیز توسط $ یا گسترش نمی‌یابند
اکو "متغیرهای $expand همچنین $either گسترش نمی‌یابند";
?>

نقل قول های دوگانه

اگر رشته در دو گیومه (") محصور شود، PHP دنباله های فرار کاراکترهای ویژه زیر را تشخیص می دهد:

سکانس های فرار
دنباله معنی
\n خط جدید (LF یا 0x0A (10) در ASCII)
\r برگشت بار (CR یا 0x0D (13) در ASCII)
\ t زبانه افقی (HT یا 0x09 (9) در ASCII)
\ v زبانه عمودی (VT یا 0x0B (11) در ASCII) (از PHP 5.2.5)
\e کاراکتر escape (ESC یا 0x1B(27) در ASCII) (از PHP 5.4.4)
\f فید صفحه (FF یا 0x0C (12) در ASCII) (از PHP 5.2.5)
\\ بک اسلش
\$ علامت دلار
\" نقل قول دوگانه
\{1,3} دنباله‌ای از نویسه‌ها که با عبارت منظم یک کاراکتر به صورت هشت‌گانه مطابقت دارند که بی‌صدا سرریز می‌شود تا در یک بایت قرار بگیرد (یعنی "\400" === "\000")
\x(1،2) دنباله ای از کاراکترها که با یک عبارت منظم کاراکتر در هگزادسیمال مطابقت دارد
\u(+) یک دنباله کاراکتر مطابق با عبارت منظم کاراکتر یونیکد که به یک رشته در نمایش UTF-8 نگاشت می شود (افزوده شده در PHP 7.0.0)

مانند رشته ای که در گیومه های تکی محصور شده است، فرار از هر کاراکتری نیز خود کاراکتر فرار را چاپ می کند. قبل از PHP 5.1.1، بک اسلش در \($var)چاپ نشده است

هردوک

راه سوم برای تعریف رشته ها استفاده از نحو heredoc است: <<< . بعد از این عبارت، باید یک شناسه و سپس یک خط جدید را مشخص کنید. پس از آن خود خط می آید و سپس همان شناسه ای که درج را می بندد.

خط بایدبا یک شناسه بسته شروع کنید، یعنی. باید در ستون اول سطر باشد. علاوه بر این، شناسه باید از قوانین نامگذاری مشابهی مانند سایر تگ‌های PHP پیروی کند: فقط شامل نویسه‌های الفبای عددی و زیرخط باشد و نباید با عدد شروع شود (خارج‌گذاری مجاز است).

توجه

توجه به این نکته بسیار مهم است که رشته با شناسه بسته نباید دارای کاراکترهای دیگری باشد، به جز نقطه ویرگول ( ; ). این بدان معناست که شناسه نباید تورفتگی داشته باشدو اینکه قبل یا بعد از نقطه ویرگول هیچ فاصله یا تبی وجود ندارد. همچنین درک این نکته مهم است که اولین کاراکتر قبل از شناسه بسته شدن باید یک کاراکتر خط جدید باشد، همانطور که توسط سیستم عامل شما تعریف شده است. به عنوان مثال، در سیستم های یونیکس، از جمله macOS، این است \n. شناسه بسته نیز باید بلافاصله با یک خط جدید دنبال شود.

در صورت نقض این قانون و عدم پاک بودن شناسه بسته، در نظر گرفته می شود که شناسه بسته شدنی وجود ندارد و PHP به جستجوی آن ادامه می دهد. اگر در این مورد، شناسه بستن صحیح هرگز یافت نشد، این امر باعث خطای تجزیه با شماره خط در انتهای اسکریپت می شود.

Beispiel #1 مثال نحوی نادرست

غذای کلاس (
عمومی $bar =<<بار
EOT;
// padding قبل از شناسه بسته شدن مجاز نیست
}
?>

Beispiel #2 مثال نحو صحیح

غذای کلاس (
عمومی $bar =<<بار
EOT;
}
?>

از Heredoc نمی توان برای مقداردهی اولیه فیلدهای کلاس استفاده کرد. از PHP 5.3، این محدودیت فقط برای هردوک هایی اعمال می شود که دارای متغیرهای درون خود هستند.

متن Heredoc مانند یک رشته دو نقل قول بدون داشتن آنها رفتار می کند. این بدان معنی است که شما نیازی به فرار از نقل قول در heredoc ندارید، اما همچنان می توانید از دنباله های فرار بالا استفاده کنید. متغیرها کنترل می شوند، اما باید در هنگام استفاده از متغیرهای پیچیده در داخل هردوک مانند زمانی که با رشته ها کار می کنید، مراقب باشید.

مثال تعریف رشته هردوک شماره 3 Beispiel

$str =<<مثال خطی،
شامل خطوط متعدد
با استفاده از نحو هردوک
EOD;

غذای کلاس
{
var $foo ;
var $bar ;

تابع __construct()
{
$this -> foo = "foo" ;
$this ->
}
}

$foo = newfoo();
$name = "نام" ;

اکو<<نام من "$name" است. $foo -> foo را تایپ می کنم .
الان دارم بیرون میارم
($foo -> نوار [ 1 ]) .
این باید یک خروجی "A" بزرگ داشته باشد: \x41
EOT;
?>

نام من "نام" است. دارم Foo را تایپ می کنم. اکنون، من خروجی بار2 را دارم. این باید یک خروجی "A" بزرگ داشته باشد: A

همچنین می توان از نحو هردوک برای انتقال داده ها از طریق آرگومان های تابع استفاده کرد:

از نسخه 5.3.0، امکان مقداردهی اولیه متغیرهای استاتیک و خصوصیات/ثابت کلاس با استفاده از نحو heredoc وجود دارد:

Beispiel #5 استفاده از heredoc برای مقداردهی اولیه متغیرهای استاتیک

// متغیرهای استاتیک
functionfoo()
{
استاتیک $bar =<<اینجا چیزی نیست...
برچسب؛
}

// ثابت های کلاس/خواص
غذای کلاس
{
const BAR =<<نمونه ای از استفاده از یک ثابت
FOOBAR;

عمومی $base =<<مثال استفاده از زمینه
FOOBAR;
}
?>

از PHP 5.3.0، امکان احاطه شناسه Heredoc با دو نقل قول نیز وجود دارد:

Nowdoc

Nowdoc برای رشته های تک گیومه مانند heredoc برای رشته های دو نقل قول است. Nowdoc شبیه هردوک است، اما در داخل آن هیچ تعویضی انجام نمی شود. این ساختار برای جاسازی کد PHP یا سایر بلوک های بزرگ متن بدون نیاز به فرار از آن ایده آل است. در این مورد کمی شبیه به ساختار SGML است. با اعلام بلوک متنی که قرار نیست پردازش شود.

Nowdoc با همان دنباله نشان داده می شود <<< ، که در heredoc استفاده می شود، اما شناسه ای که به دنبال آن قرار می گیرد در یک نقل قول قرار می گیرد، برای مثال، <<<"EOT" . تمام شرایطی که برای شناسه‌های heredoc اعمال می‌شود، برای nowdoc نیز اعمال می‌شود، به‌ویژه شرایطی که برای شناسه پایانی اعمال می‌شود.

Beispiel # 7 nowdoc مثال

اکو<<<"EOD"
نمونه متن،
شامل خطوط متعدد
با استفاده از syntax nowdoc با اسلش های برگشتی همیشه به معنای واقعی کلمه رفتار می شود،
به عنوان مثال، \\ و \".
EOD;

نتیجه اجرای این مثال:

نمونه ای از متنی که چندین خط را با استفاده از نحو nowdoc پوشانده است. اسلش های برگشتی همیشه به معنای واقعی کلمه مانند \\ و \".

مثال شماره 8 مثالی برای نقل قول از رشته Nowdoc با متغیرها

/* مثال پیچیده تر با متغیرها. */
غذای کلاس
{
عمومی $foo ;
عمومی $bar ;

تابع __construct()
{
$this -> foo = "foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = newfoo();
$name = "نام" ;

اکو<<<"EOT"
نام من "$name" است. من دارم $foo->foo را تایپ می کنم.
الان دارم تایپ میکنم ($foo->bar).
این نباید یک خروجی بزرگ "A" داشته باشد: \x41
EOT;
?>

نتیجه اجرای این مثال:

نام من "$name" است. من دارم $foo->foo را تایپ می کنم. الان دارم تایپ میکنم ($foo->bar). این نباید یک خروجی بزرگ "A" داشته باشد: \x41

مثال شماره 9 مثال داده استاتیک

غذای کلاس (
عمومی $bar =<<<"EOT"
بار
EOT;
}
?>

اظهار نظر:

پشتیبانی nowdoc در PHP 5.3.0 اضافه شد.

پردازش متغیرها

اگر رشته ای در دو گیومه یا با هردوک مشخص شود، متغیرهای داخل آن پردازش می شوند.

دو نوع نحو وجود دارد: ساده و پیچیده. نحو ساده ساده تر و راحت تر است. پردازش یک متغیر، یک مقدار آرایه ( آرایه) یا خواص شی ( هدف - شی) با حداقل تلاش

سینتکس پیچیده را می توان با پرانتزهای فرفری اطراف عبارت شناسایی کرد.

نحو ساده

اگر مترجم با علامت دلار ( $ )، تا آنجایی که ممکن است کاراکترها را برای تشکیل نام متغیر صحیح می گیرد. اگر می خواهید انتهای یک نام را مشخص کنید، نام متغیر را در پرانتزهای فرفری قرار دهید.

$juice = "apple" ;

echo "او مقداری آب میوه نوشید." . PHP_EOL ;

// غلط. "s" یک کاراکتر معتبر برای نام متغیر است، اما نام متغیر $juice است.
echo "او مقداری آب میوه از $آبمیوه نوشید." ;

// درست. انتهای نام متغیر به شدت با استفاده از براکت ها مشخص می شود:
echo "او مقداری آبمیوه از $( juice ) s نوشید." ;
?>

نتیجه اجرای این مثال:

مقداری آب سیب نوشید. مقداری آبمیوه نوشید. مقداری آب میوه از سیب نوشید.

عنصری از آرایه ( آرایه) یا خاصیت شی ( هدف - شی). در شاخص های آرایه، براکت بسته شدن ( ] ) پایان تعریف شاخص را نشان می دهد. قوانین مشابهی برای ویژگی های شیء اعمال می شود که برای متغیرهای ساده.

مثال #10 مثال ساده نحوی

define("KOOLAID" , "koolaid1" );
$juices = array("apple" , "narange" , "koolaid1" => "بنفش" );

echo "او مقداری آبمیوه [ 0 ] $نوشید." . PHP_EOL ;
echo "او مقداری آبمیوه [ 1 ] $نوشید." . PHP_EOL ;
echo "او مقداری $juices [ koolaid1 ] juice نوشید." . PHP_EOL ;

افراد کلاس(
public $john = "جان اسمیت" ;
public $jane = "جین اسمیت" ;
public $robert = "رابرت پاولسن" ;

عمومی $smith = " اسمیت " ;
}

$people = افراد جدید();

echo " $people -> جان مقداری $juices [ 0 ] juice نوشید." . PHP_EOL ;
echo " $people -> john سپس به $people -> jane سلام کرد." . PHP_EOL ;
echo " $people -> همسر جان به $people -> رابرت سلام کرد." PHP_EOL ;
echo " $people -> robert به دو $people -> smiths سلام کرد." ; // کار نمی کند
?>

نتیجه اجرای این مثال:

مقداری آب سیب نوشید. مقداری آب پرتقال نوشید. مقداری آب بنفش نوشید. جان اسمیت مقداری آب سیب نوشید. جان اسمیت سپس به جین اسمیت سلام کرد. همسر جان اسمیت به رابرت پالسن سلام کرد رابرت پالسن به آن دو سلام کرد.

PHP 7.1.0 پشتیبانی اضافه شد منفیشاخص های عددی

مثال #11 شاخص های عددی منفی

$string = "رشته" ;
اکو "شخصیت در شاخص -2 است$string [- 2 ] ." , PHP_EOL ;
$string [- 3 ] = "o" ;
اکو "تغییر کاراکتر در موقعیت -3 به "o" خط زیر را ایجاد می کند:$string ." , PHP_EOL ;
?>

نتیجه اجرای این مثال:

کاراکتر با شاخص -2 n است. با تغییر کاراکتر در موقعیت -3 به "o" رشته زیر تولید می شود: قوی

برای هر چیز پیچیده تر، از نحو پیچیده استفاده کنید.

نحو پیچیده (فرفری).

پیچیده نامیده می شود نه به این دلیل که درک آن دشوار است، بلکه به این دلیل که اجازه استفاده از عبارات پیچیده را می دهد.

هر متغیر اسکالر، عنصر آرایه یا ویژگی شی نگاشت شده به یک رشته را می توان در یک رشته با این نحو نمایش داد. فقط عبارت را درست مانند خارج از رشته بنویسید و سپس آن را در آن محصور کنید { و } . زیرا { نمی توان فرار کرد، این نحو تنها زمانی شناسایی می شود که $ مستقیماً پس از آن دنبال می شود { . استفاده کنید {\$ برای چاپ {$ . چند مثال گویا:

// نمایش همه خطاها
error_reporting (E_ALL);

$great = "عالی" ;

// کار نمی کند، خروجی ها: این (عالی)
echo "This is ($great)" ;

// کار می کند، خروجی: این عالی است
echo "This is ($great)" ;

// آثار
اکو «این میدان عریض است($square -> width ) 00 سانتی متر." ;

// کار می‌کند، کلیدهای نقل‌قول فقط با نحو براکت فرفری کار می‌کنند
echo "این کار می کند: ( $arr [ "key" ]) " ;

// آثار
echo "این کار می کند: ( $arr [ 4 ][ 3 ]) " ;

// این اشتباه است به همان دلیل که $foo خارج است
// خطوط. به عبارت دیگر، همچنان کار خواهد کرد
// اما از آنجایی که PHP ابتدا به دنبال ثابت foo می گردد، این فراخوانی می شود
// خطای سطح E_NOTICE (ثابت تعریف نشده).
اکو "درست نیست:( $arr [ foo ][ 3 ]) " ;

// آثار. هنگام استفاده از آرایه های چند بعدی در داخل
// رشته ها همیشه از بریس های فرفری استفاده می کنند
echo "این کار می کند: ( $arr [ "foo" ][ 3 ]) " ;

// آثار.
echo "این کار می کند: ". $arr [ "foo" ][ 3 ];

اکو "این نیز کار می کند:( $obj -> مقادیر [ 3 ]-> name ) " ;

اکو "این مقدار متغیر نامگذاری شده است$name : ($( $name )) " ;

اکو این مقدار متغیر بر اساس نام است که توسط تابع getName() برگردانده می شود:($( getName ())) ";

اکو "این مقدار متغیر بر اساس نام است که توسط \$object->getName():($( $object -> getName ())) " ;

// کار نمی کند، خروجی ها: این همان چیزی است که getName() برمی گرداند: (getName())
اکو "این چیزی است که getName() برمی گرداند: (getName())";
?>

همچنین با استفاده از این نحو امکان دسترسی به خصوصیات شی در رشته ها وجود دارد.

غذای کلاس (
var $bar = "من نوار هستم." ;
}

$foo = newfoo();
$bar = "bar" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo ->( $baz [ 1 ])) \n" ;
?>

نتیجه اجرای این مثال:

من بار هستم من بار هستم

اظهار نظر:

توابع، فراخوانی متدها، متغیرهای کلاس ایستا و ثابت های کلاس به صورت داخلی کار می کنند {$} ، از نسخه 5 PHP. با این حال، مقدار مشخص شده به عنوان یک نام متغیر در زمینه رشته ای که در آن تعریف شده است در نظر گرفته می شود. استفاده از بریس های مجعد منفرد ( {} ) برای دسترسی به مقادیر توابع، متدها، ثابت های کلاس یا متغیرهای کلاس ایستا کار نخواهد کرد.

// نمایش همه خطاها
error_reporting (E_ALL);

آبجوهای کلاس (
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "Alexander Keith\"s" ;

// این کار می کند، خروجی می دهد: من A & W را می خواهم
echo "I'd like ($( beers :: softdrink )) \n" ;

// این نیز کار می کند، خروجی: من الکساندر کیت را می خواهم
echo "I'd like ($( beers :: $ale )) \n" ;
?>

دسترسی به یک کاراکتر در یک رشته و تغییر آن

نویسه‌های رشته‌ها را می‌توان با تعیین افست آنها از ابتدای رشته، با شروع از صفر، در براکت‌های مربع بعد از رشته، به عنوان مثال، $str استفاده کرد و تغییر داد. رشته ای را برای این منظور به عنوان آرایه ای از کاراکترها در نظر بگیرید. اگر نیاز به دریافت یا جایگزینی بیش از 1 کاراکتر دارید، می توانید از توابع استفاده کنید substr()و substr_replace().

اظهار نظر: از PHP 7.1.0، مقادیر افست منفی پشتیبانی می شود. آنها افست را از انتهای رشته تنظیم می کنند. قبلاً افست های منفی باعث خطای سطح می شدند E_NOTICEهنگام خواندن (بازگرداندن یک رشته خالی) یا E_WARNINGدر نوشتن (با رها کردن رشته بدون تغییر).

اظهار نظر: یک کاراکتر در یک رشته همچنین با استفاده از پرانتزهای فرفری مانند $str(42) قابل دسترسی است.

توجه

تلاش برای نوشتن به یک افست خارج از رشته، رشته را با فاصله تا آن افست پر می کند. انواع غیر صحیح به اعداد صحیح تبدیل می شوند. نوع افست اشتباه باعث خطای سطح می شود E_WARNING. فقط اولین کاراکتر رشته اختصاص داده شده استفاده می شود. از PHP 7.1.0، اختصاص یک رشته خالی باعث خطای مرگبار می شود. قبلاً در این مورد یک بایت تهی (NULL) اختصاص داده می شد.

توجه

رشته ها در PHP آرایه های داخلی از بایت ها هستند. در نتیجه، دسترسی یا اصلاح یک رشته با افست چند بایت ایمن نیست و فقط باید با رشته هایی در رمزگذاری های تک بایتی مانند ISO-8859-1 انجام شود.

اظهار نظر: از آنجایی که PHP 7.1.0 استفاده از یک نمایه خالی باعث خطای مرگبار می شود، قبلاً در چنین حالتی رشته بدون هشدار به آرایه تبدیل می شد.

مثال #12 چندین رشته نمونه

// اولین کاراکتر رشته را دریافت کنید
$str = "این یک آزمایش است." ;
$first = $str [ 0 ];

// کاراکتر سوم رشته را دریافت کنید
$third = $str [ 2 ];

// آخرین کاراکتر رشته را دریافت کنید
$str = "این هنوز یک آزمایش است." ;
$last = $str [ strlen($str )- 1 ];

// آخرین کاراکتر رشته را تغییر دهید
$str = "به دریا نگاه کن" ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

از PHP 5.4، offset در یک رشته باید یک عدد صحیح یا یک رشته حاوی اعداد باشد، در غیر این صورت یک هشدار صادر خواهد شد. قبلاً یک افست توسط رشته ای مانند داده می شد "فو"، بدون اخطار به تبدیل شد 0 .

مثال شماره 13 تفاوت بین PHP 5.3 و PHP 5.4

$str = "abc" ;

Var_dump($str["1"]);
var_dump (isset($str [ "1" ]));

Var_dump($str[ "1.0" ]);
var_dump (isset($str [ "1.0" ]));

Var_dump($str["x"]);
var_dump (isset($str [ "x" ]));

Var_dump($str[ "1x" ]);
var_dump (isset($str [ "1x" ]));
?>

نتیجه اجرای این مثال در PHP 5.3 این است:

رشته (1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)

نتیجه اجرای این مثال در PHP 5.4 این است:

string(1) "b" bool(true) اخطار: تعدیل رشته غیرقانونی "1.0" در /tmp/t.php در خط 7 رشته (1) "b" bool(false) هشدار: رشته غیرقانونی افست "x" در / tmp/t.php در خط 9 رشته (1) "a" bool(false) string(1) "b" bool(false)

اظهار نظر:

تلاش برای دسترسی به متغیرهایی از انواع دیگر (به استثنای آرایه ها یا اشیایی که واسط های خاصی را پیاده سازی می کنند) با یا {} بی صدا برگرد خالی.

اظهار نظر:

PHP 5.5 پشتیبانی از دسترسی به کاراکترها را با استفاده از نحو اضافه کرد یا {} .

توابع مفید زیادی برای اصلاح رشته ها وجود دارد.

توابع اصلی در بخش توابع رشته و برای جستجوی پیشرفته و جایگزینی، توابع عبارت منظم سازگار با Perl توضیح داده شده است.

تبدیل به رشته

مقدار را می توان با استفاده از قالب به رشته تبدیل کرد (رشته)، یا توابع strval(). در عباراتی که رشته مورد نیاز است، تبدیل به صورت خودکار انجام می شود. وقتی از توابع استفاده می کنید این اتفاق می افتد اکویا چاپ، یا زمانی که مقدار یک متغیر با یک رشته مقایسه می شود. خواندن بخش‌های Types و Type Manipulation کتابچه راهنمای کاربر، موارد زیر را واضح‌تر می‌کند. همچنین ببینید settype().

آرایه ها همیشه به رشته تبدیل می شوند "آرایه"، بنابراین نمی توانید محتویات آرایه را نمایش دهید ( آرایه) استفاده كردن اکویا چاپتا ببینیم چه چیزی در آن وجود دارد. برای مشاهده یک عنصر منفرد، از چیزی مانند استفاده کنید echo $arr["foo"]. برای نکاتی در مورد نحوه نمایش/مشاهده همه محتوا به زیر مراجعه کنید.

برای تبدیل یک متغیر نوع "هدف - شی"در هر نوع رشتهاز روش جادویی __toString استفاده شده است.

معنی خالیهمیشه به رشته خالی تبدیل می شود.

همانطور که در بالا می بینید، رشته بندی مستقیم آرایه ها، اشیاء یا منابع، به جز انواع آنها، هیچ اطلاعات مفیدی در مورد خود مقادیر ارائه نمی دهد. یک راه مناسب تر برای خروجی مقادیر برای اشکال زدایی استفاده از توابع است print_r()و var_dump().

اکثر مقادیر در PHP را می توان به یک رشته برای ذخیره سازی دائمی تبدیل کرد. این روش سریال سازی نامیده می شود و با تابع قابل انجام است serialize().

تبدیل رشته ها به اعداد

اگر رشته به عنوان یک مقدار عددی شناسایی شود، مقدار و نوع حاصل به صورت زیر تعیین می شود.

اگر رشته حاوی هیچ یک از کاراکترهای "."، "e" یا "E" نباشد و مقدار عدد در محدوده اعداد صحیح (تعریف شده) قرار می گیرد. PHP_INT_MAX، رشته به عنوان یک عدد صحیح تشخیص داده می شود ( عدد صحیح). در تمام موارد دیگر، یک عدد ممیز شناور در نظر گرفته می شود ( شناور).

مقدار توسط قسمت ابتدایی رشته تعیین می شود. اگر رشته با یک مقدار عددی معتبر شروع شود، از آن مقدار استفاده می شود. در غیر این صورت مقدار 0 (صفر) خواهد بود. یک مقدار عددی معتبر یک یا چند رقم (که ممکن است حاوی یک نقطه اعشار باشد) است که به صورت اختیاری با یک علامت و به دنبال آن یک توان اختیاری قرار می گیرد. توان "e" یا "E" به دنبال یک یا چند رقم است.

$foo = 1 + "10.5" ; // $foo یک شناور است (11.5)
$foo = 1 + "-1.3e3" ; // $foo یک شناور است (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo یک عدد صحیح است (1)
$foo = 1 + "bob3" ; // $foo یک عدد صحیح است (1)
$foo = 1 + "10 خوک کوچک" ; // $foo یک عدد صحیح است (11)
$foo = 4 + "10.2 Little Piggies" ; // $foo یک شناور است (14.2)
$foo = "10.0 pigs" + 1 ; // $foo یک شناور است (11)
$foo = "10.0 pigs" + 1.0 ; // $foo یک شناور است (11)
?>

برای اطلاعات بیشتر در مورد این تبدیل به بخش strtod(3) مستندات یونیکس مراجعه کنید.

اگر می خواهید هر یک از مثال های این بخش را تست کنید، آن و خط زیر را کپی و پیست کنید تا ببینید چه اتفاقی می افتد:

echo "\$foo== $foo ; type: ". gettype ($foo ) . "
\n"
?>

انتظار نداشته باشید که کد کاراکتر را با تبدیل آن به یک عدد صحیح دریافت کنید (به عنوان مثال، در C انجام می شود). برای تبدیل کاراکترها به کدهای اسکی خود و بالعکس، از توابع استفاده کنید ord()و chr().

جزئیات پیاده سازی نوع رشته

7 سال پیش

مستندات اشاره ای نمی کنند، اما یک نقطه ویرگول در پایان هردوک در واقع به عنوان یک نقطه ویرگول واقعی تفسیر می شود و به این ترتیب، گاهی اوقات منجر به خطاهای نحوی می شود.

$foo =<<آ ب پ ت
پایان؛
?>

این نمی کند:

فوو(<<آ ب پ ت
پایان؛
);
// خطای نحوی، غیرمنتظره ";"
?>

بدون نقطه ویرگول، به خوبی کار می کند:

فوو(<<آ ب پ ت
پایان
);
?>

3 سال پیش

می توانید از رشته ای مانند آرایه char (مانند C) استفاده کنید

$a = "تست آرایه رشته ای";

var_dump($a);
// بازگرداندن رشته (17) "آزمایش آرایه رشته"

var_dump($a);
// رشته بازگشتی (1) "S"

// -- با آرایه ریخته گری --
var_dump((آرایه)$a);
// برگرداندن آرایه (1) ( => رشته (17) "تست آرایه رشته")

var_dump((آرایه)$a);
// رشته بازگشتی (17) "S"

نوریهیوری

15 سال پیش

شما می توانید از سینتکس پیچیده برای قرار دادن ارزش هر دو ویژگی شی و متدهای شی در یک رشته استفاده کنید. مثلا...
آزمون کلاس(
عمومی $one = 1 ;
تابع عمومی دو()(
بازگشت 2 ;
}
}
$test = new Test();
echo "foo ( $test -> one ) bar ($test -> two ()) " ;
?>
خروجی "foo 1 bar 2" خواهد داشت.

با این حال، شما نمی توانید این کار را برای همه مقادیر موجود در فضای نام خود انجام دهید. ثابت های کلاس و خواص/روش های ایستا کار نمی کنند زیرا نحو پیچیده به دنبال "$" می گردد.
آزمون کلاس(
const ONE = 1 ;
}
echo "foo (Test::ONE) bar" ;
?>
این خروجی "foo (Test::one) bar" را نشان می دهد. ثابت ها و ویژگی های ایستا از شما می خواهند که رشته را جدا کنید.

3 سال پیش

مراقب باشید که مطابق با "تبدیل رشته به اعداد" است:

اگر ("123abc" == 123) پژواک "(intstr == int) اشتباهاً درست را آزمایش می کند.";

// از آنجایی که یک طرف یک عدد است، رشته به اشتباه از intstr به int تبدیل می‌شود، که سپس با عدد تست مطابقت دارد.

// برای همه شرط‌ها درست است، مانند if و switch (احتمالاً حلقه‌های while)!

// این می تواند یک خطر امنیتی بزرگ در هنگام آزمایش/استفاده/ذخیره ورودی کاربر باشد، در حالی که انتظار و آزمایش فقط برای یک عدد صحیح است.

// به نظر می رسد تنها راه حل این است که 123 یک رشته به عنوان "123" باشد بنابراین هیچ تبدیلی اتفاق نمی افتد.

?>

6 سال پیش

صفرهای پیشرو در رشته ها (کمترین شگفتی) به عنوان اکتال در نظر گرفته نمی شوند.
در نظر گرفتن:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x $x است، y $y است"; //نشان می دهد "x 123 است، y 83 است"
به عبارت دیگر:
* صفرهای پیشرو در لفظهای عددی در کد منبع به عنوان "اکتال" تفسیر می شوند، c.f. strtol().
* صفرهای پیشرو در رشته ها (به عنوان مثال داده های ارسال شده توسط کاربر)، هنگامی که (به طور ضمنی یا صریح) به عدد صحیح نادیده گرفته می شوند، و به عنوان اعشار در نظر گرفته می شوند، c.f. strtod().

10 سال پیش

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

// اعلامیه هک
function_expr ($v ) (برگردان $v ;)
$_expr = "_expr" ;

// زمین بازی ما
define("qwe" , "asd");
تعریف کردن("zxc", 5 );

$a= 3 ;
$b= 4 ;

عملکرد ج($a, $b) (برگشت$a+ $b; }

// استفاده
اکو"پیش{ $_expr(1 + 2 )} پست\n"; // خروجی "pre 3 post"
اکو"پیش{ $_expr(qwe)} پست\n"; // خروجی "pre asd post"
اکو"پیش{ $_expr(ج($a, $b)+ zxc* 2 )} پست\n"; // خروجی "پیش از 17 پست"

// نحو عمومی این است ($_expr(...))
?>

2 سال پیش

من فکر می کنم که اضافه کردن این نظر مفید خواهد بود تا اطلاعات حداقل در صفحه سمت راست سایت PHP ظاهر شود.

توجه داشته باشید که اگر قصد دارید از یک رشته نقل قول دوگانه با یک کلید ارتباطی استفاده کنید، ممکن است با خطای T_ENCAPSED_AND_WHITESPACE مواجه شوید. برخی این را به عنوان یکی از پیام های خطای کمتر آشکار می دانند.

عبارتی مانند:

$ میوه=آرایه(
"آ"=> "سیب",
"ب"=> موز,
//و غیره
);

چاپ "این یک است$ میوه[ "آ"]"; // T_ENCAPSED_AND_WHITESPACE
?>

قطعا تکه تکه خواهد شد

می توانید آن را به صورت زیر حل کنید:

چاپ"این یک است$ میوه[ آ] " ; // کلید را لغو نقل قول کنید
چاپ"این یک است${ میوه ها[ "آ"]} " ; // نحو پیچیده
چاپ"این یک است{ $ میوه[ "آ"]} " ; // تنوع نحو پیچیده
?>

من ترجیح شخصی برای آخرین تغییر دارم، زیرا طبیعی‌تر و نزدیک‌تر به این است که عبارت خارج از رشته چگونه خواهد بود.

(حداقل برای من) روشن نیست که چرا PHP نقل قول را در داخل عبارت اشتباه تفسیر می کند، اما تصور می کنم که ربطی به این دارد که نقل قول ها بخشی از رشته ارزش نیستند - زمانی که رشته قبلا تجزیه می شود، نقل قول ها فقط در راه … ؟

2 سال پیش

هر دو باید کار کنند:(

کلاسآزمایش کردن{
استاتیک عمومی
$var= "ایستا";
public const VAR =
"Const";

عملکرد عمومی بگویید HelloStatic() {
اکو
سلام:{ این $:: $var} " ;
}

عملکرد عمومی بگویید HelloConst() {
اکو
سلام:{ این $::VAR)" ; //خطای تجزیه: خطای نحوی، غیرمنتظره ")"، انتظار "["
}
}

$obj=جدیدآزمایش کردن();
$obj-> بگویید HelloStatic();
$obj-> بگویید HelloConst();

3 سال پیش

چیزی که من تجربه کردم و بدون شک به کسی کمک خواهد کرد. . .
در ویرایشگر من، این دستور HTML و کامنت $ را برجسته می کند:

$html =<<<"EOD"
$نظر
EOD;

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

$html =<<$نظر
EOD;

کار با آن را بسیار آسان می کند

11 سال پیش

برای حفظ ذهن خود، نظرات قبلی در مورد تاریخ ها را نخوانید ;)

وقتی بتوان هر دو رشته را به اعداد تبدیل کرد (در آزمون ("$a" > "$b") سپس از اعداد به دست آمده استفاده می شود، در غیر این صورت رشته های FULL به صورت char به char مقایسه می شوند:

var_dump("1.22" > "01.23" ); // bool (نادرست)
var_dump("1.22.00" > "01.23.00" ); // bool (درست)
var_dump("1-22-00" > "01-23-00" ); // bool (درست)
var_dump((شناور)"1.22.00" > (شناور)"01.23.00" ); // bool (نادرست)
?>



جداول:

C_id | شرکت | محل
1 | جستجوی OOO | میدان کودیکینو 15/3
2 | CJSC Elita | Slunysvalinsk 133/7
3 | OJSC Pyshpyshch | Soldatodachestroyskoe 404

نوع تعمیر (تعمیر_انواع)
r_id | تعمیر_انواع |
1 | چکش + میخ
2 | راهنمایی زیبایی
3 | تعمیرات اساسی

لیست سفارشات (فهرست)
l_id | چه کسی | چه نیازی | زمان | نظر اپراتور
1 | 1 | 2 | %timestamp% | %operator_text%
2 | 2 | 1 | | %text%
3 | 3 | 2 | | %text%

جدول شماره 1 حاوی لیستی از مشتریان است.
جدول شماره 2 شامل لیستی از خدمات است.
جدول شماره 3 شامل فهرستی از سفارشات جاری برای تیم های عملیاتی است. این جدول به طور مرتب به روز می شود و برای پر کردن آن از فرم وب استفاده می شود. از آنجایی که تعداد زیادی سفارش وارد می شود، رکوردها به صورت شناسه مشتری و سرویس در جدول وارد می شوند.

در واقع، مشکل این است که جدول سوم باید در فرم وب "انتخاب سفارش" نمایش داده شود و به جای ID، باید فیلدهای مربوطه را از ستون های دیگر جایگزین کنید.

کد:
$query = "انتخاب * از لیست";
$result = mysql_query ($query);
while($row=mysql_fetch_array($result. // از هر سطر نتیجه بگیرید
(اکوی "";// نمایش داده ها
}




CREATE TABLE "table_name" ("id" int(255) NOT NULL AUTO_INCREMENT، "list" text (80) NOT NULL، PRIMARY KEY("id".

INSERT INTO "table_name" ("list") VALUES ("bla-bla")



بهترین جواب $query =
"
شرکت ها را انتخاب کنید.شرکت، نوع_تعمیرات.انواع_تعمیر، list.comment_l
از لیست
شرکت های عضویت داخلی
در list.Who = company.c_id
تعمیر_انواع اتصال داخلی
در لیست "What need" = repair_types.r_id
";

البته، تصاویر، فایل‌های صوتی، اطلاعات ویدئویی، داده‌های انیمیشن و اپلت‌ها بخش مهمی از محتوای شبکه جهانی وب را تشکیل می‌دهند، اما اکثریت قریب به اتفاق داده‌های موجود در وب همچنان به صورت متن - دنباله‌ای از کاراکترها هستند. مثل این جمله نوع داده اصلی PHP برای نمایش متن یک رشته است.

شرح رشته ها در PHP

رشته ها دنباله ای از کاراکترها هستند که می توانند به عنوان یک موجودیت واحد در نظر گرفته شوند - به متغیرها اختصاص داده می شوند، به عنوان ورودی به توابع ارسال می شوند، از توابع برگردانده می شوند، یا به عنوان خروجی برای نمایش در صفحه وب کاربر ارسال می شوند. ساده ترین راه برای تعیین یک رشته در کد PHP این است که دنباله ای از کاراکترها را در گیومه، تک ("") یا دو (") قرار دهید، به عنوان مثال، به صورت زیر:

$myString = "رشته ساده"; $anotherString = "رشته ای دیگر";

تفاوت بین نقل‌قول‌های تکی و نقل‌قول‌های دوگانه به این دلیل است که محیط PHP تا چه حد کاراکترهای نقل‌شده را قبل از ایجاد رشته واقعی تفسیر می‌کند. اگر رشته در گیومه های تکی محصور شده باشد، تقریباً هیچ تفسیری انجام نمی شود و اگر رشته در گیومه های دوگانه محصور شود، محیط PHP جایگزینی مقادیر تمام متغیرهایی را که در رشته مشخص شده است، انجام می دهد و همچنین برخی از دنباله‌های کاراکتر ویژه را جایگزین می‌کند که با بک اسلش کاراکتر () شروع می‌شوند.

به عنوان مثال، پس از پردازش کد زیر که بخشی از یک صفحه وب است:

$count = 13; $string1 = "رشته \"سلام، دنیا!\" حاوی کاراکترهای $count است.
"; $string2 = "رشته \"سلام، دنیا!\" حاوی کاراکترهای $count است.
"; echo $string1; echo $string2;

می توانید انتظار داشته باشید که خروجی زیر را در پنجره مرورگر دریافت کنید:

جایگزینی ارزش با استفاده از بریس های فرفری

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

حالت اول این است که مفسر نمی تواند تعیین کند که نام متغیر به کجا ختم می شود، و موقعیت دوم زمانی رخ می دهد که لازم باشد مقدار عبارت را در رشته جایگزین کنیم، نه مقدار یک متغیر ساده. در این موارد، توسعه‌دهنده می‌تواند با قرار دادن نام یا عبارت مورد پردازش در پرانتزهای فرفری (()) شفاف‌سازی کند.

به عنوان مثال، مفسر PHP در پردازش کد زیر مشکلی ندارد:

$sport = "والیبال"; $play = "من عاشق بازی کردن $sport هستم.";

در چنین مواردی، مفسر با کاراکتر $ مواجه می‌شود، سپس شروع به زیر رشته کردن کاراکترها می‌کند تا نام متغیر را آشکار کند، و این کار را تا زمانی که با فاصله یا نقطه‌ای که به دنبال نام متغیر $sport است مواجه شود. فاصله ها و نقطه ها نمی توانند بخشی از نام متغیر باشند، بنابراین مشخص می شود که متغیر مورد نظر $sport نام دارد. سپس مفسر PHP با موفقیت یک مقدار برای متغیر داده شده ("volleyball") پیدا کرده و آن را جایگزین می کند.

اما گاهی اوقات نمی توان انتهای نام متغیر را با فاصله یا نقطه مشخص کرد. به مثال زیر توجه کنید:

$sport1 = "اراده"; $sport2 = "پا"; $sport3 = "سبد"; // ساختارهای نادرست $play1 = "من عاشق بازی $sport1ball هستم."; $play2 = "من عاشق بازی $sport2ball هستم."; $play3 = "من عاشق بازی $sport3ball هستم.";

در این صورت، اثر مورد نظر حاصل نخواهد شد، زیرا مفسر PHP رشته $sport1 را به عنوان بخشی از نام متغیر $sport1ball در نظر می گیرد که ظاهراً هیچ مقداری به آن اختصاص داده نشده است. در عوض، باید از نماد زیر استفاده کنید:

// ساخت معتبر $play1 = "من دوست دارم ($sport1)توپ بازی کنم."; $play2 = "من عاشق بازی ($sport2) توپ هستم."; $play3 = "من عاشق بازی ($sport3) توپ هستم.";

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

به دلایل مشابه، مفسر PHP، اگر از پرانتزهای فرفری استفاده نشود، در جایگزینی مقادیر عبارات پیچیده با نام متغیرها، مانند دسترسی به عناصر آرایه‌های چند بعدی و متغیرهای شی، مشکل دارد. قاعده کلی این است که اگر یک پرانتز فرفری باز (() بلافاصله با یک $ دنبال شود، مفسر PHP مقدار عبارت را با نام متغیر تا پرانتز بسته () ارزیابی می‌کند و سپس مقدار حاصل را جایگزین می‌کند. به رشته (اگر می خواهید یک مقدار تحت اللفظی ($) در رشته ظاهر شود، این کار را می توان با پیشوند هر یک از این کاراکترها با علامت بک اسلش، \ انجام داد).

کاراکترها و شاخص های کاراکتر در رشته ها

بر خلاف برخی از زبان های برنامه نویسی دیگر، PHP نوع کاراکتر جداگانه ای ندارد که با نوع رشته ای یکسان نباشد. به طور کلی، توابعی که به پارامترهای واقعی کاراکتر در زبان های دیگر نیاز دارند، به گونه ای طراحی شده اند که رشته هایی به طول 1 در PHP بگیرند.

انتخاب کاراکترهای مجزا از یک رشته را می توان با تعیین یک عدد دنباله کاراکتر مبتنی بر صفر انجام داد، که باید بلافاصله بعد از نام متغیر رشته در پرانتزهای فرفری مشخص شود. چنین شخصیت هایی در واقع رشته های تک کاراکتری هستند. برای مثال، اجرای کد زیر:

$myString = "دوبرابر"; برای ($index = 0؛ $index< strlen($myString); $index++) { $char = $myString{$index}; print("$char$char"); }

در پنجره مرورگر خروجی زیر حاصل می شود:

بدیهی است که هر کاراکتر رشته دو بار در هر عبور از حلقه چاپ می شود. تابع strlen() طول یک رشته را برمی گرداند.

عملیات رشته

PHP دو عملیات رشته ای را ارائه می دهد: عملگر نقطه (.)، یا عملگر الحاق، و عملگر نقطه و علامت مساوی (.=)، یا عملگر الحاق و انتساب. به مثال زیر توجه کنید:

$string1 = "این یک قسمت است"; $string2 = "رشته ها"; // الحاق رشته echo $string1." simple ".$string2."
". simple "; $string1 .= $string2; echo $string1; // "این بخشی از یک رشته ساده است"

لازم به ذکر است که در مثال بالا، اولین دستور echo چندین پارامتر واقعی رشته را ارسال نکرده است. فقط یک پارامتر واقعی رشته ارسال می شود که از الحاق چهار رشته حاصل می شود. خطوط اول و سوم با استفاده از متغیرها تنظیم می شوند و خطوط دوم و چهارم یک رشته تحت اللفظی هستند که در دو گیومه محصور شده اند.

ساختار نحوی سند فرعی (Heredoc)

علاوه بر ساختارهای نحوی رشته ها در گیومه های تکی و دوگانه، PHP راه دیگری برای تعیین یک رشته ارائه می دهد که به نام ساختار نحوی سند تودرتو (Heredoc). همانطور که مشخص شد، چنین ساختار نحوی وسیله ای بسیار مناسب برای تعیین تکه های بزرگ متن جایگزین با استفاده از متغیرها است، زیرا نیاز کاربر را به تعیین نقل قول های داخلی با استفاده از کاراکترهای خاص برطرف می کند. این روش به ویژه هنگام ایجاد صفحاتی که حاوی فرم های HTML هستند مفید است.

علامت عملگر مورد استفاده در ساختار نحوی سند فرعی است (<<<). За этим знаком должна непосредственно следовать метка (не заключенная в кавычки), которая обозначает начало многострочного текста. Интерпретатор PHP продолжает включать в состав значения переменной следующие строки до тех пор, пока снова не появится эта же метка в начале строки. За заключительной меткой может следовать необязательная точка с запятой, а какие-либо другие символы после метки не допускаются.

به مثال زیر توجه کنید:

$string =<<

EOT; echo $string;

توجه داشته باشید که کلمه پایانی EOT نشان داده شده در بالا به هیچ وجه نباید دارای تورفتگی باشد، در غیر این صورت به عنوان متعلق به متن اضافه شده تلقی می شود. استفاده از کلمه "EOT" به عنوان یک برچسب ضروری نیست، برچسب می تواند هر نامی داشته باشد، طبق قوانین نامگذاری متغیرهای PHP.

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

توابع رشته

زبان پی اچ پی طیف گسترده ای از توابع را برای پردازش و تبدیل رشته ها فراهم می کند. اگر تا به حال نیاز به ایجاد تابع خود دارید که رشته ها را کاراکتر به کاراکتر می خواند و پردازش می کند تا یک رشته جدید تشکیل دهد، ابتدا در نظر بگیرید که آیا شخص دیگری قبلاً با کار مشابهی روبرو شده است یا خیر. و اگر شهود نشان می دهد که چنین امکانی وجود دارد، شاید یک تابع داخلی وجود داشته باشد که مشکل را حل کند. برای اطلاعات بیشتر در مورد توابع رشته، لطفاً به https://php.net/manual/en/ref.strings.php مراجعه کنید.

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

اعتبار سنجی رشته

رایج ترین سوالاتی که در مورد رشته ها باید پاسخ داده شود چیست؟ اولین سوال در لیست سوالات این است که طول یک رشته چقدر است. برای پاسخ به آن، از تابع strlen() استفاده می شود که نام آن مخفف طول رشته است - طول رشته. نمونه ای از استفاده از چنین تابعی در زیر نشان داده شده است:

$enStr = "سلام دنیا!"; $rusStr = "رشته ساده"; echo $enStr." - کاراکترهای ".strlen($enStr)."
"; echo $rusStr." - ".strlen($rusStr)." شخصیت ها"؛

اجرای این کد خروجی مبهم زیر را تولید می کند:

همانطور که می بینید، برای رشته "Hello world!" نتیجه صحیح است، اما برای رشته "رشته ساده" نتیجه 27 کاراکتر نادرست است. موضوع اینجا چیست؟ واقعیت این است که تابع strlen() بایت ها را می شمارد نه کاراکترها. در حالت اول، تمام کاراکترهای رشته به زبان انگلیسی هستند، یعنی. با رمزگذاری ASCII نشان داده شده و به صورت 1 بایت کدگذاری می شوند. در حالت دوم، رشته شامل کاراکترهای روسی است که در 2 بایت (UTF-8) کدگذاری شده اند. برای جلوگیری از مشکلات بعدی هنگام کار با توابع رشته، PHP باید از توابعی برای رمزگذاری های چند بایتی استفاده کند که با پیشوند mb_ شروع می شوند. این بدان معناست که در مثال قبلی، باید تابع strlen() را با mb_strlen() جایگزین کنید و به صراحت کدگذاری را مشخص کنید:

Echo $rus_str." - ".mb_strlen($rus_str, "UTF8")." کاراکترها";

یافتن کاراکترها و زیر رشته ها

سوال بعدی در مورد رشته ها این است که آنها شامل چه چیزی هستند. به عنوان مثال، تابع strpos() به شما اجازه می دهد تا شماره موقعیت یک کاراکتر خاص را در یک رشته، در صورت وجود، پیدا کنید:

$enStr = "سلام دنیا!"; echo "Symbol "l": ".strpos($enStr, "l"); // 2

موقعیت‌های مربوط به استفاده از تابع strpos() مواردی هستند که در آن عدم حساسیت نوع PHP می‌تواند مشکل ساز باشد. اگر مطابقت یافت نشد، تابع false برمی‌گرداند، و اگر کاراکتر جستجو با اولین کاراکتر رشته مطابقت داشته باشد، تابع 0 را برمی‌گرداند (زیرا موقعیت‌های کاراکتر در رشته از 0 شروع می‌شود، نه 1). هر دوی این مقادیر زمانی که برای آزمایش یک شرط بولی استفاده می شوند، با false مطابقت دارند. یکی از راه‌های تشخیص این مقادیر استفاده از عملگر مقایسه هویت است (عملگر === که از PHP4 معرفی شد)، که فقط در صورتی true برمی‌گرداند که عملوندهای آن یکسان و از یک نوع باشند. عملگر مقایسه هویت را می توان برای آزمایش اینکه آیا مقدار بازگشتی 0 (یا نادرست) است، بدون خطر اشتباه گرفتن مقدار بازگشتی با مقادیر دیگری که ممکن است پس از ریخته گری یکسان شوند، استفاده شود.

تابع strpos() همچنین می تواند برای جستجوی یک زیر رشته به جای یک کاراکتر استفاده شود. برای این کار کافی است یک رشته چند کاراکتری و نه رشته تک کاراکتری را به عنوان رشته مورد نظر مشخص کنید. علاوه بر این، در فراخوانی این تابع، می توانید یک پارامتر عدد صحیح اضافی را تعیین کنید که موقعیت شروع جستجو را مشخص می کند.

همچنین امکان جستجو در جهت مخالف، از انتهای رشته تا ابتدا وجود دارد. برای این کار از تابع strrpos() استفاده می شود. (توجه داشته باشید که این تابع یک r اضافی در نام خود دارد که مخفف معکوس است.) این تابع رشته مورد جستجو و رشته تک کاراکتری را برای جستجو به عنوان پارامتر می گیرد و سپس آخرین موقعیت های وقوع پارامتر دوم را برمی گرداند. در پارامتر اول (برخلاف تابع strpos()، در تابع strrpos() رشته جستجو شده باید فقط از یک کاراکتر تشکیل شده باشد.) پس از اعمال این تابع با همان پارامترهای مثال قبلی، موقعیت دیگری پیدا می شود:

$enStr = "سلام دنیا!"; echo "Symbol "l": ".strrpos($enStr, "l"); // 9 زیرا جستجو از انتهای رشته است

مقایسه

آیا آن خط با این خط مطابقت دارد؟ ظاهراً کد اغلب باید به این سؤال نیز پاسخ دهد، به خصوص وقتی صحبت از مدیریت ورودی از کاربر نهایی می شود.

ساده ترین روش برای یافتن پاسخ این سوال که آیا رشته ها یکسان هستند، استفاده از عملگر مقایسه برابری ساده (==) است که برابری نه تنها رشته ها، بلکه اعداد را نیز بررسی می کند. هنگام استفاده از عملگر ==، اگر دو رشته دارای توالی کاراکترهای یکسان باشند، یکسان در نظر گرفته می شوند. این تعریف دقیق‌تر از رشته‌های یکسان را بررسی نمی‌کند، مانند شرطی که این رشته‌ها در یک آدرس در حافظه ذخیره می‌شوند، اما به حروف کوچک و بزرگ حساس هستند (به عبارت دیگر، حروف مقایسه شده بزرگ یا کوچک هستند).

نتایج مقایسه دو رشته با استفاده از عملگر == (یا عملگرهای مربوطه< и >) فقط در صورتی قابل اعتماد است که هر دو عملوند رشته ای باشند و مشخص باشد که هیچ تبدیل نوع رخ نداده است. و نتایج بررسی با استفاده از تابع strcmp() که در زیر توضیح داده شده است، همیشه قابل اعتماد هستند.

مهمترین تابع مقایسه رشته ها که بیشتر کارها را انجام می دهد strcmp() است. این تابع دو رشته را به عنوان پارامتر می گیرد و بایت به بایت را مقایسه می کند تا زمانی که تفاوتی پیدا کند. سپس اگر رشته اول کوچکتر از رشته دوم باشد، این تابع یک عدد منفی و اگر رشته دوم از رشته اول کوچکتر باشد یک عدد مثبت برمی گرداند. اگر رشته ها یکسان باشند، تابع strcmp() صفر را برمی گرداند.

تابع ()strcasecmp به همین ترتیب کار می کند، با این تفاوت که مقایسه برای برابری به حروف بزرگ و کوچک حساس نیست. برای مثال، فراخوانی به strcasecmp ("hey!"، "HEY!") باید صفر را برگرداند.

جستجو کردن

توابع مقایسه ای که توضیح داده شد به شما اطلاع می دهند که آیا یک رشته با رشته دیگری برابر است یا خیر. و برای تعیین اینکه آیا یک رشته در رشته دیگری وجود دارد یا خیر، از تابع strpos() که در بالا توضیح داده شد یا تابع strstr() و توابع مشابه استفاده کنید.

تابع strstr() رشته مورد جستجو و رشته مورد جستجو (به ترتیب) را به عنوان پارامتر می گیرد. در صورت موفقیت آمیز بودن، این تابع بخشی از رشته را که با اولین رخداد رشته جستجو شروع می شود (و شامل رشته جستجو می شود) برمی گرداند. اگر چنین رشته ای یافت نشد، تابع false را برمی گرداند. قطعه کد زیر نمونه هایی از نحوه استفاده از این تابع را ارائه می دهد:

$str = "سلام دنیا!"; $findStr = "جهان"; پژواک "زیر رشته" $findStr" در رشته اصلی: ".strstr($str, $findStr);

مانند تابع ()strcmp، تابع strstr() یک نسخه بدون حروف بزرگ به نام stristr() دارد (i در آن نام مخفف insensitive است). تابع ()stristr از همه جهات با تابع strstr() یکسان است، با این تفاوت که مقایسه، حروف کوچک را به عنوان حروف بزرگ در نظر می گیرد.

انتخاب رشته فرعی

بسیاری از توابع رشته PHP عملیات برش و چسباندن رشته ها را انجام می دهند. برش انتخاب بخشی از یک رشته است و درج یک تغییر انتخابی یک رشته است. به خاطر داشته باشید که حتی توابع درج (اغلب) رشته داده شده به عنوان پارامتر ورودی را تغییر نمی دهند. به طور معمول، چنین توابعی یک نسخه اصلاح شده را برمی گرداند و پارامتر اصلی را بدون تغییر می گذارد.

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

$str = "سلام دنیا!"; echo mb_substr($str, 7, 3, "UTF8"); // "جهان"

هر دو پارامتر موقعیت شروع و پارامتر طول می توانند منفی باشند، اما در هر دو مورد، مقدار منفی معنای متفاوتی دارد. اگر موقعیت شروع منفی باشد، موقعیت کاراکتر شروع رشته فرعی با شمارش معکوس از انتهای رشته به جای شمارش رو به جلو از ابتدای رشته تعیین می شود. (موقعیت شروع -1 نشان می دهد که شمارش از آخرین کاراکتر شروع می شود، مقدار -2 نشان دهنده نویسه ماقبل آخر و غیره است.)

بر این اساس، ممکن است فرض کنیم که یک مقدار طول منفی نیز به این معنی است که رشته فرعی باید با شمارش معکوس از کاراکتر شروع، به جای شمارش به جلو، تعیین شود، اما اینطور نیست. این ادعا که کاراکتر در موقعیت شروع اولین کاراکتر در رشته برگشتی (و نه آخرین) است، همیشه درست است. در عوض، یک پارامتر طول منفی به این معنی است که کاراکتر پایانی با شمارش معکوس از انتها، به جای شمارش رو به جلو از موقعیت شروع، تعیین می شود.

در زیر چند نمونه با پارامترهای مثبت و منفی آورده شده است:

$str = "سلام دنیا!"; echo mb_substr($str, 7, 3, "UTF8")."
"; // "جهان" echo mb_substr($str, -4, 3, "UTF8")."
"; // "world" echo mb_substr($str, 0, -5, "UTF8")."
"؛ // "سلام"

حذف فاصله ها و زبانه ها از رشته ها

از نظر فنی، توابع chop()، ltrim() و trim() توابعی برای کار با زیر رشته ها هستند (که بسیار شبیه توابع دیگر هستند)، اما در واقع این توابع برای حذف کاراکترهای ناخواسته از رشته ها طراحی شده اند. توابع chop()، ltrim() و trim() به ترتیب کاراکترهای فضای خالی انتهایی، پیشرو، پیشرو و انتهایی را از رشته ای که به عنوان تنها پارامتر رشته داده شده است حذف می کنند.

علاوه بر فاصله‌ها، این توابع سایر نویسه‌های فضای خالی را حذف می‌کنند، مانند آن‌هایی که با دنباله‌های فرار \n، \r، \t و \0 نشان داده شده‌اند (نویسه‌های انتهای خط، برگه‌ها و کاراکترهای خالی که برای علامت‌گذاری پایان استفاده می‌شوند. یک خط در برنامه های C).

در PHP، استفاده از تابعی برای حذف فضای سفید در انتهای رشته به نام chop() رایج است، اما یک تابع یکسان، با نام توصیفی تر rtrim() نیز می تواند فراخوانی شود. در نهایت باید توجه داشت که تابع chop() علیرغم اینکه نام آن که به معنای "برش کردن" است بسیار تهدیدآمیز به نظر می رسد، به پارامتر اصلی $original که مقدار قبلی را حفظ می کند آسیبی نمی رساند.

تعویض رشته

تمام توابع رشته ای که در بالا مورد بحث قرار گرفت، به جای تشکیل یک رشته کاملاً جدید، برای واکشی بخشی از پارامتر ورودی ارائه شده است. این بخش توابع str_replace() و substr_replace() را برای این منظور مورد بحث قرار می دهد.

تابع str_replace() به شما این امکان را می دهد که تمام رخدادهای یک زیررشته خاص را با رشته دیگری جایگزین کنید. این تابع سه پارامتر دارد: رشته ای که باید جستجو شود، رشته فرعی که بعد از یافتن آن جایگزین می شود و رشته ای که برای جایگزینی استفاده می شود. به مثال زیر توجه کنید:

$str = "سلام دنیا!"; echo str_replace("جهان"، "سیاره"، $str); // "سلام سیاره!"

جایگزینی در تمام موارد زیر رشته یافت شده در رشته جستجو انجام می شود. اگر از مثال بالا برای جایگزینی نام یک شهر در یک دایره المعارف منسوخ استفاده می شد، پس از تبدیل کل متن دانشنامه به یک خط PHP، می توان چنین جایگزینی را در کل متن در یک پاس انجام داد.

همانطور که در بالا نشان داده شده است، تابع str_replace() بخشی از رشته منبع را که باید با جستجوی رخدادهای زیر رشته مورد نظر در رشته منبع جایگزین شود، انتخاب می کند. در مقابل، substr_replace() بخشی را که باید با موقعیت مطلق آن جایگزین شود را انتخاب می کند. این تابع حداکثر چهار پارامتر را می گیرد: رشته ای که باید جایگزین شود، رشته ای که باید جایگزین شود، موقعیت شروع جایگزینی، و (به عنوان یک پارامتر اختیاری) طول رشته ای که باید جایگزین شود. به مثال زیر توجه کنید:

echo substr_replace("ABCDEFG"، "-"، 2، 3); // "AB-FG"

بخش CDE رشته با یک کاراکتر جایگزین شده است. توجه داشته باشید که در این مورد مجاز به جایگزینی یک رشته فرعی با یک رشته با طول متفاوت است. اگر پارامتر طول حذف شود، کل قسمت رشته پس از موقعیت شروع جایگزین شده است.

تابع ()substr_replace پارامترهای منفی را به عنوان موقعیت و طول شروع می‌پذیرد که دقیقاً مانند تابع ()substr در بالا رفتار می‌شود. یادآوری این نکته مهم است که در نتیجه عملیات انجام شده با استفاده از توابع str_replace و substr_replace، رشته اصلی بدون تغییر باقی می ماند.

در نهایت، تعدادی از توابع کم استفاده وجود دارد که رشته های جدیدی را از توابع قدیمی تشکیل می دهند. تابع strrev() به سادگی یک رشته جدید با کاراکترهای رشته ورودی معکوس برمی گرداند. تابع str_repeat() یک رشته و یک پارامتر عدد صحیح می گیرد و رشته ای حاوی تعداد مشخصی از کپی های پارامتر رشته را برمی گرداند:

echo str_repeat("ABC"، 3); // ABCABCABC

توابع تبدیل مورد

این توابع به شما این امکان را می دهد که حروف کوچک را به حروف بزرگ و بالعکس تبدیل کنید. تابع strtolower() رشته ای را با تمام حروف تبدیل به حروف کوچک برمی گرداند. فرقی نمی کند که رشته اصلی فقط دارای حروف بزرگ باشد یا بزرگ و کوچک. مثلا:

$str = "سلام دنیا!"; echo mb_strtolower($str، "UTF8"); // "سلام دنیا!"

اگر قبلاً نیاز به انجام اعتبارسنجی فرم های زیادی را تجربه کرده اید، ممکن است متوجه شده باشید که تابع strtolower() ابزار بسیار مفیدی برای مدیریت آدرس های ایمیل دریافتی از کاربرانی است که هنوز از حروف کوچک بودن آدرس های ایمیل اطلاعی ندارند. -غیر حساس دیگر توابع مرتبط با این دسته کم مفید نیستند.

تابع strtoupper() رشته ای را با تمام حروف تبدیل به حروف بزرگ برمی گرداند. به عنوان مثال قطعه کد زیر است:

$str = "سلام دنیا!"; echo mb_strtoupper($str، "UTF8"); // "سلام دنیا!"

تابع ucfirst() فقط حرف اول رشته را بزرگ می کند، تابع ucwords() حرف اول هر کلمه در رشته را بزرگ می کند. تابع ucwords() و ucfirst() تابع مشابهی برای رمزگذاری چند بایتی ندارند، بنابراین با رشته های سیریلیک سازگار نیستند.

توابع برای معرفی کاراکترهای کنترلی

یکی از مزایای زبان PHP این است که می توان از آن برای تبادل اطلاعات تقریباً با هر سیستمی استفاده کرد. وسایلی از این دست معمولاً نوعی «چسب نرم افزاری» محسوب می شوند. در این نقش، زبان PHP برای تعامل با سرورهای پایگاه داده، سرورهای LDAP، برای تبادل داده از طریق سوکت ها و خود اتصال HTTP استفاده می شود. اغلب این تعامل ابتدا با ایجاد یک رشته پیام (مانند پرس و جوی پایگاه داده) و سپس ارسال آن پیام به برنامه دریافت کننده انجام می شود. اما برنامه ها اغلب به برخی از کاراکترها معنای خاصی می دهند و بنابراین باید به کاراکترهای کنترلی تبدیل شوند. این بدان معناست که برنامه دریافت کننده دستور داده شده است که به جای اعمال رفتار ویژه با آنها، چنین کاراکترهایی را به عنوان بخشی تحت اللفظی رشته در نظر بگیرد.

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

تابع addslashes () نقل‌قول‌های تکی و دوگانه، بک اسلش‌ها و کاراکترهای تهی را به دنباله‌های فرار با استفاده از بک اسلش تبدیل می‌کند، زیرا این کاراکترهایی هستند که معمولاً هنگام آماده‌سازی کوئری‌ها در برابر پایگاه‌های داده باید به دنباله‌های فرار تبدیل شوند:

$escapedstring = addslashes("رشته با "نقل قول"."); $query = "INSERT INTO test (quote) مقادیر ("$escapedstring")"; $result = mysqli_query ($link, $query) یا die(mysql_error());

اجرای این کد مانع از تفسیر اشتباه عبارت SQL می شود که گویی رشته درست قبل از حرف "k" به پایان رسیده است. و پس از واکشی این داده ها، باید از تابع stripslashes() برای حذف بک اسلش ها استفاده کنید.

تابع quotemeta() مجموعه وسیع تری از کاراکترها را به دنباله های فرار تبدیل می کند. همه این کاراکترها معمولاً معانی خاصی در خط فرمان یونیکس دارند: " . "، " " "، " + "، " * "، " ? "، " [ "، " ] "، "^"، "("، "$" و ")". برای مثال، کد زیر را اجرا کنید:

$str = "این کاراکترها ($, *, ^) باید تبدیل شوند."; echo quotemeta ($str);

خروجی این خط:

عملکردهای خروجی به یک دستگاه خارجی و به یک خط

ساختارهای اصلی مورد استفاده برای خروجی چاپ و اکو هستند که قبلاً به تفصیل مورد بحث قرار گرفت. روش استاندارد برای خروجی مقادیر متغیرها به یک دستگاه خارجی این است که نام این متغیرها را در یک رشته نقل قول دوگانه (که توسط مفسر برای جایگزینی مقادیر متغیرها پردازش می‌شود) قرار دهید و سپس ارسال کنید. این رشته به ساختار چاپ یا اکو.

اگر به خروجی فرمت شده دقیق تری نیاز دارید، می توانید از توابع printf() و sprintf() PHP استفاده کنید. این دو تابع پارامترهای یکسانی دارند: یک رشته فرمت خاص و به دنبال آن تعداد دلخواه پارامترهای دیگری که در مکان‌های صحیح در رشته قالب جایگزین می‌شوند تا نتیجه ایجاد شود. تنها تفاوت بین printf() و sprintf() این است که printf() رشته نتیجه را مستقیماً به دستگاه خارجی مورد استفاده برای خروجی می فرستد، در حالی که sprintf() رشته نتیجه را به عنوان نتیجه اجرای آن برمی گرداند.

چند کلمه برای برنامه نویسان باتجربه C. این نسخه از sprintf() کمی با نسخه C تفاوت دارد زیرا sprintf() نیازی به ارائه رشته اختصاصی برای نوشتن ندارد، زیرا مفسر PHP از طرف دیگر برای رشته حاصل حافظه اختصاص می دهد. کاربر.

مشکل اصلی مرتبط با استفاده از این توابع، تعریف صحیح رشته قالب است. هر کاراکتر در رشته قالب مستقیماً در مقدار حاصل ظاهر می شود، به جز کاراکترهای % و کاراکترهایی که بلافاصله پس از آن کاراکترها قرار می گیرند. نماد % شروع یک مشخصات تبدیل را نشان می‌دهد، که نحوه خروجی‌گیری یکی از پارامترهایی را که از رشته فرمت پیروی می‌کند به دستگاه خارجی مشخص می‌کند.

بعد از علامت %، پنج عنصر وجود دارد که مشخصات تبدیل را تشکیل می‌دهند که در زیر توضیح داده شده‌اند، که برخی از آنها اختیاری هستند: لایه‌بندی، تراز، حداقل عرض، دقت و نوع:

  • علامت منهای اختیاری (-) برای نشان دادن منفی بودن یک عدد استفاده می شود.
  • کاراکتر تک (اختیاری) پر یا 0 یا یک فاصله () است. این نماد برای پر کردن هر فضایی استفاده می‌شود که در غیر این صورت خالی می‌ماند، اما کاربر بر انتخاب آن اصرار داشت (با تنظیم پارامتر حداقل عرض خیلی زیاد). اگر این کاراکتر padding مشخص نشده باشد، به طور پیش‌فرض padding با فاصله است.
  • کاراکتر توجیه اختیاری (-) مشخص می کند که آیا مقدار خروجی باید توجیه چپ یا راست باشد. اگر این کاراکتر مشخص شده باشد، مقدار به سمت چپ توجیه می شود و در صورت عدم وجود، توجیه سمت راست اعمال می شود.
  • یک مقدار عددی با حداقل عرض اختیاری که حداقل تعداد موقعیت هایی را که مقدار خروجی باید اشغال کند را مشخص می کند. (اگر مقادیر خروجی به موقعیت های کاراکتر بیشتری از مقدار مشخص شده نیاز دارند، در این صورت مقدار خروجی خارج از محدوده است.)
  • یک مشخص‌کننده دقت اختیاری که به صورت نقطه (.) و سپس یک عدد قالب‌بندی شده است. مشخص کننده نشان می دهد که با چه دقتی، با تعداد ارقام اعشاری بعد از نقطه اندازه گیری می شود، یک عدد ممیز شناور با دقت دوگانه باید خروجی شود. (کاربرد این مشخصات به جز اعداد ممیز شناور با دقت مضاعف، تأثیری بر خروجی داده ها ندارد.)
  • یک کاراکتر واحد که نشان می دهد نوع مقدار چگونه باید تفسیر شود. کاراکتر f نشان می دهد که مقدار باید به عنوان یک عدد ممیز شناور با دقت دوگانه چاپ شود، کاراکتر s نشان می دهد که مقدار باید به عنوان یک رشته چاپ شود، و کاراکترهای ممکن باقی مانده (b، c، d، o، x، x ) نشان می دهد که مقدار باید به عنوان یک عدد صحیح و خروجی در فرمت های مختلف تفسیر شود. این فرمت‌ها b برای خروجی در فرمت باینری، c برای خروجی یک کاراکتر با مقدار کد ASCII مربوطه، o برای خروجی در فرمت هشت‌گانه، x برای خروجی در قالب هگزادسیمال (با حروف کوچک اعداد) و X برای نمایش هستند. اعداد هگزادسیمال که از حروف بزرگ به عنوان نمادهای تحت اللفظی برای ارقام استفاده می کنند.

نمونه زیر نمونه ای از خروجی یک عدد ممیز شناور با دقت دوگانه به چندین روش مختلف است:

%10f 
%10f
%2.2f، $value، $value، $value، $value)؛ ?>

نتایج زیر را ایجاد می کند:

ساختار استفاده شده در این مثال

...
یک توصیفگر HTML است که به مرورگر می گوید که بلوک محصور در این توصیفگر باید به معنای واقعی کلمه قالب بندی شود، بدون اینکه چندین فاصله در یک فضا فشرده شود و غیره.

توابع کار با کد HTML

PHP تعدادی توابع برای دستکاری رشته های حاوی داده های خاص وب فراهم می کند. نمای کلی این ویژگی ها در جدول زیر ارائه شده است:

توابع رشته ای که برای کار با کد HTML طراحی شده اند

عملکرد شرح
htmlspecialchars() یک رشته را به عنوان پارامتر می گیرد و رشته ای را برمی گرداند که در آن چهار کاراکتر که معنای خاصی در زبان HTML دارند با رشته های خاص جایگزین شده اند. هر یک از این کاراکترها با کامپوننت HTML مربوطه جایگزین می‌شوند که وقتی متن صفحه در مرورگر گسترش می‌یابد، دوباره با کاراکتر اصلی جایگزین می‌شود. کاراکتر & با مولفه & کاراکتر " (کاراکتر نقل قول دوگانه) جایگزین می شود - با کاراکتر "< - < а символ > - >
htmlentities() پردازش کامل تری نسبت به htmlspecialchars() انجام می دهد. با کامپوننت HTML نه تنها کاراکترهای خاص، بلکه همه کاراکترهایی را که جایگزینی با مؤلفه HTML برای آنها ارائه شده است، جایگزین می کند.
get_html_translation_table() یکی از دو ثابت خاص (HTML_SPECIAL_CHARS یا HTML_ENTITIES) را می گیرد و یک جدول تبدیل استفاده شده توسط توابع htmlspecialchars() یا htmlentities() را به ترتیب برمی گرداند. جدول جستجو آرایه‌ای است که کلیدهای آن رشته‌های کاراکتر و مقادیر متناظر آن رشته‌هایی برای جایگزینی آنها هستند.
nl2br() یک رشته را به عنوان پارامتر می گیرد و همان رشته را باز می گرداند، اما با توصیفگر
، قبل از همه کاراکترهای انتهای خط (\n، \r، یا \r\n) درج شده است. نیاز به استفاده از این تابع ایجاد می شود، برای مثال، اگر می خواهید همان پاراگراف بندی متن نمایش داده شده در مرورگر را مانند متن منبع ارائه دهید.
strip_tags() یک رشته را به عنوان پارامتر می گیرد و تمام تلاش خود را می کند تا رشته ای بدون تمام توصیفگرهای HTML و تمام توصیفگرهای PHP تشکیل دهد.

هش کردن داده ها با استفاده از الگوریتم MD5

الگوریتم MD5 یک الگوریتم پردازش رشته ای است که برای تولید یک به اصطلاح خلاصه یا امضای دیجیتال برای هر رشته ای که به عنوان پارامتر ارسال می شود استفاده می شود. این الگوریتم یک رشته با طول ثابت بر اساس رشته ورودی تولید می کند که از 32 رقم هگزا دسیمال (0-9، a-f) تشکیل شده است. نتایج به دست آمده توسط الگوریتم MD5 دارای خواص بسیار مفیدی است که در زیر توضیح داده شده است:

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

پیاده سازی PHP از الگوریتم MD5 به عنوان تابع md5() موجود است که یک رشته را به عنوان ورودی می گیرد و نتایج را به صورت خلاصه 32 کاراکتری تولید می کند. برای مثال، اجرای کد زیر:

$str = "سلام دنیا!"; echo "کد هش برای رشته "$str": ".md5($str)."
"; $str = "سلام، دنیا!"; echo "کد هش برای رشته "$str": ".md5($str)."
"; $str = "Hello world"; echo "کد هش برای رشته "$str": ".md5($str)."
";

در پنجره مرورگر نتایج زیر به دست می آید:

البته در این حالت تمام رشته های ورودی شباهت زیادی به یکدیگر دارند اما رشته های خروجی شباهت قابل مشاهده ای ندارند. علاوه بر این، محدوده مقادیر خروجی ممکن بسیار زیاد است (1632)، بنابراین احتمال پردازش دو رشته مختلف (که مقدار MD5 یکسانی را تولید می کنند) بسیار بعید است.

با توجه به ویژگی های بالا الگوریتم MD5، مقادیر به دست آمده با کمک آن می تواند برای حل طیف گسترده ای از مسائل، از جمله مواردی که در زیر توضیح داده شده است، استفاده شود:
محاسبه جمع چک یک پیام یا فایل
برای بررسی اینکه آیا پیام در حین انتقال خراب شده است، می‌توانید خلاصه MD5 را همراه با پیام ارسال کنید و پس از دریافت پیام، خلاصه MD5 را دوباره تولید کنید. اگر دو نسخه خلاصه مطابقت نداشته باشند، در حین انتقال فساد ایجاد شده است.
کنترل بر روی اینکه آیا محتوای یک فایل بدون تغییر باقی می ماند یا خیر
این کار شبیه به کار محاسبه چک‌سوم است. الگوریتم MD5 اغلب برای انجام این عملیات در موتورهای جستجو استفاده می شود، اگر لازم باشد به طور دوره ای بررسی شود که آیا یک صفحه وب تغییر کرده است یا خیر و در صورت لزوم دوباره فهرست بندی شود. واقعیت این است که برای تأیید بیشتر، سازماندهی ذخیره سازی خلاصه MD5 بسیار ساده تر از کل فایل منبع است.
تقسیم رشته ها یا فایل های متعدد به زیر مجموعه ها
برای حل مشکل تقسیم مجموعه ای از رشته ها به N زیر مجموعه به طور تصادفی انتخاب شده، می توانید خلاصه MD5 هر رشته را محاسبه کنید، چند کاراکتر هگزادسیمال اول را بگیرید، آنها را به یک عدد تبدیل کنید، مدول مدول آن عدد را بدست آورید و از آن استفاده کنید. باقیمانده به عنوان عدد زیر مجموعه، که این خط باید در آن نوشته شود.

علاوه بر تابع md5()، PHP تابع md5_file() را ارائه می دهد که نام فایل را به عنوان پارامتر می گیرد و مقدار MD5 هش شده مربوط به محتویات فایل را برمی گرداند.

توابع طراحی شده برای ارزیابی شباهت رشته ها

در عمل، اغلب تعیین شباهت دو رشته ضروری است. بدیهی است که نتایج تخمین تشابه رشته بستگی به مفهوم شباهت رشته دارد.

اگر شباهت در املا ملاک ارزیابی تشابه باشد، می توان اعمال کرد متریک لونشتاین. تابع levenshtein () دو رشته را به عنوان پارامتر می گیرد و حداقل تعداد کاراکترهای اضافه، حذف و جایگزینی مورد نیاز برای تبدیل یک رشته به رشته دیگر را برمی گرداند. به یک مثال توجه کنید:

echo levenshtein ("Tim"، "Time"); // 1 echo levenshtein("boy", "chefboyardee"); // 9 echo levenshtein("هرگز"، "باهوش"); // 2

اگر شباهت آوایی به عنوان معیار تشابه در نظر گرفته شود، می توان از توابع soundex() و metaphone() برای ارزیابی شباهت استفاده کرد. هر دوی این توابع رشته مورد نظر را به عنوان ورودی دریافت می‌کنند و یک رشته کلیدی را برمی‌گردانند که طبقه‌بندی تلفظ کلمه داده شده را نشان می‌دهد (که به عنوان یک کلمه انگلیسی در نظر گرفته می‌شود). اگر دو کلمه به‌عنوان محتوای یک رشته ورودی دقیقاً با یک مقدار خروجی مطابقت داشته باشند، احتمالاً یکسان تلفظ می‌شوند.

توابع تجزیه و نشانه گذاری

گاهی اوقات لازم می‌شود که یک برنامه رشته‌ها را به اجزاء تقسیم کند، که بر اساس تعریف خودش از آنچه که باید جزء در نظر گرفته شود، هدایت می‌شود. فرآیند تقسیم یک رشته طولانی به قطعات را نشانه گذاری می گویند. به طور خاص، چنین فرآیندی بخشی از رویه کلی برای تفسیر یا کامپایل هر برنامه رایانه ای، از جمله برنامه ای که به زبان PHP نوشته شده است، است. زبان PHP یک تابع ویژه برای این منظور فراهم می کند - strtok ().

تابع ()strtok دو پارامتر دارد: یک رشته برای نشانه گذاری، و یک رشته حاوی تمام جداکننده ها (کاراکترهایی که به عنوان مرز بین توکن ها در نظر گرفته می شوند). اولین باری که فراخوانی می شود، از هر دو پارامتر استفاده می شود و تابع یک مقدار رشته ای را نشان می دهد که نشان دهنده اولین نشانه است. برای واکشی توکن های بعدی، همان فراخوانی انجام می شود، اما پارامتر رشته منبع حذف می شود. تابع آدرس رشته داده شده در پارامتر اول را به خاطر می آورد و از آن به عنوان رشته فعلی استفاده می کند. علاوه بر این، این تابع به خاطر می آورد که پردازش در تماس قبلی کجا خاتمه یافته است. به مثال زیر توجه کنید:

$token = strtok("اسکریپت نویسی وب سمت سرور تعبیه شده HTML منبع باز", " "); while($token) ( echo $token."
"; $token = strtok(" ");)

که نتیجه آن خروجی زیر در پنجره مرورگر است:

رشته اصلی در محلی که هر فضا در آن قرار دارد تقسیم می شود.

تابع ()strtok توکن ها را یکی یکی می سازد. همچنین می‌توانید از تابع explode() استفاده کنید، که تقریباً همان کار را انجام می‌دهد، با این تفاوت که همه نشانه‌ها را یکجا در یک آرایه ذخیره می‌کند. هنگامی که نشانه ها به عنوان یک آرایه ارائه می شوند، می توان هر عملیاتی از جمله مرتب سازی را روی آنها انجام داد.

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

$explodeResult = explode("AND", "one AND a two AND a three");

که منجر به یک آرایه $explode_result حاوی سه عنصر می شود که هر کدام یک رشته هستند: "one"، "a two" و "a three". در این مثال خاص، هیچ حرف بزرگی در هیچ یک از رشته های موجود در آرایه وجود ندارد زیرا جداکننده AND در نتیجه وجود ندارد.

رشته جداکننده استفاده شده در تابع explode() کاملاً متفاوت از رشته تحدید شده در تابع sttok() است. جداکننده یک رشته کامل است، بنابراین تمام کاراکترهای آن رشته باید به همان ترتیبی که در جداکننده وجود دارد در رشته منبع پیدا شوند تا جداکننده پیدا شده در نظر گرفته شود.

از طرف دیگر، یک رشته محدود شده در تابع ()strtok کاراکترهای منفرد زیادی را مشخص می کند که هر کدام به عنوان یک جداکننده در نظر گرفته می شوند. این بدان معنی است که تابع explode() انتخابی تر است، اما بیشتر مستعد شکستگی است. به ویژه، اگر یک رشته طولانی به طور تصادفی حتی یک فاصله یا یک کاراکتر انتهای خط را که بخشی از جداکننده است از دست بدهد، ممکن است کل عملکرد این تابع شکسته شود.

تابع explode() دارای یک تابع معکوس به نام implode() است که دو پارامتر دارد: یک رشته اتصال (شبیه به رشته جداکننده در تابع explode()) و یک آرایه از رشته ها، شبیه به رشته ای که توسط explode(برگردانده شده است. ) عملکرد. تابع implode() رشته ای را برمی گرداند که با قرار دادن یک رشته اتصال بین تمام عناصر رشته متوالی در یک آرایه ایجاد شده است.