--> Strings and Patterns trong PHP 7 (P1- Strings) - ForSharing ToDu ForSharing.Info, [Keep Better In The Life] | [ForSharing
picture

Blog

Strings and Patterns trong PHP 7 (P1- Strings)



Strings

  • Strings trong php là 1 chuỗi các byte và không chứa thông tin biên dịch.
  • PHP lưu trữ độ dài và nội dung của chuối và không dựa vào ký tự kết thúc để biểu thị. Điều này giúp chuỗi nhị phân an toàn và các ký tự NULL trong cuối sẽ không gây nhầm lấn.
  • Vệ bộ nhớ, trên hệ thống 32 bit sẽ lên tới 2GB và không giới hạn khi hệ thống là 64 bit.

Declaring Strings  – Khai báo chuỗi

  • Trong php chuỗi sẽ được khai báo kiểu đơn giản hoặc kiểu phức tạp. Sự khác biệt là các chuỗi phức tạp sẽ được đánh giá đối với các ký tự điều khiển và các biến.
  • Chuỗi đơn giản sẽ được khai báo trong “dấu trích dẫn” trong khi các chuỗi phức tạp sẽ được khai báo trong “dấu ngoặc kép”
<?php

$name = 'Bob';

$a = 'Hello $name\n';

$b = "Hello $name\n";

echo $a;       // Hello $name\n

echo $b;       // Hello Bob

?>

Embedding Variables  – Biến nhúng

  • Một trong những ưu điểm chính của chuỗi phức tạp trong php là php sẽ phân tích chúng và tự động đánh giá các tên biến có trong chuỗi.
  • Khi sử dụng các chuỗi đơn giản mà không được đánh giá, bạn cần phải chấm dứt chuỗi và nối biến đó với chuỗi đó.
  • Các tên biến được đánh dấu bằng $. Khi phân tích cú pháp gặp phải một chuỗi, nó sẽ cố gắng tạo ra tên biến bằng cách thêm nhiều ký tự chữ và số để tạo một tên biến hợp lệ.
<?php

$catfood = "Cheeseburgers";

echo 'I can haz $catfood';

echo 'I can haz ' . $catfood;

echo "I can haz $catfood?";

// I can haz $catfood

// I can haz Cheeseburgers?

// I can haz Cheeseburgers?
<?php

$dogfood = ['Pellets'];

$catfood = new stdClass();

$catfood->favorite = "Cheeseburger";

echo "$dogfood[0]";             // Pellets

echo "$catfood->favorite";      // Cheeseburger
<?php

$burger = "Cheeseburger";

echo "I can haz {$burger}";

echo "I can haz ${burger}";

echo "I can haz $burgers";

echo "I can haz {$burger}s";

echo "I can haz { $burger }";

// I can haz Cheeseburger

// I can haz Cheeseburger

// no variable $burgers

// I can haz Cheeseburgers

// I can haz { Cheeseburger }
<?php

$catfood = new stdClass();

$catfood->name = "Cheeseburgers";

$cat = new stdClass();

$cat->canhaz = [$catfood];

echo "$cat->canhaz[0]->name"; // array to string conversion

echo "{$cat->canhaz[0]->name}"; // Cheeseburgers

Control Characters – ký tự điều khiển

  • Khi PHP gặp 1 chuỗi phức tạp, 1 chuỗi được khai báo trong dấu ngoặc kép, nó sẽ đánh giá chuỗi cho các biến và ký tự điều khiển.
  • Các ký tự điều khiển được đánh dấu gạch chéo ngược theo sau là mã. Sử dụng dấu ngoặc chéo ngược theo sau bởi bất kỳ điều gì khác ngoài ký tự điều khiển sẽ dẫn đến dấu gạch chéo ngược được hiển thị.
<?php

echo "Hello \World"; // Hello \World

Danh sách các ký tự điều khiển thường được sử dụng:

Biểu tượng cảm xúc có điểm cuối Unicode.

<?php

echo "\u{1F418}";  //🐘

Heredoc and Nowdoc

  • Heredoc laf một cách thuận tiện để khai báo chuỗi kéo dài nhiều dòng. Thay vì phải thêm nhiều ký tự dòng, bạn có thể khai báo chuỗi theo 1 định dãng dễ dàng hơn.
  • Chuỗi Heredoc được đánh giá cho các ký tự và biến điều khiển, giống như các chuối trích dẫn kép.
  • Chuỗi Heredoc được sử dụng phổ biến để tạo truy vấn SQL, tạo các đoạn mã HTML được định dạng cho email hoặc trang web. Bạn sử dụng chũng để khởi tạo biến.
  • Nowdoc (được giới thiệu trong PHP 5.3.0): Cách này khá giống với Heredoc, nhưng bắt đầu bằng <<<‘Định-Danh’ (có cặp ” – heredoc thì không có). Nowdoc sẽ không phân tích biến đề chèn vào chuỗi.

Heredocs sử dụng cú pháp như sau:

<?php

echo <<<HEREDOC

  This is a heredoc string, note:

  1) the capitalization of the tag

  2) the tag name follows variable naming rules

  3) where the closing tag is

HEREDOC;

Nowdoc sử dụng cú pháp như sau:

<?php

echo <<<'NOWDOC'

This is a nowdoc string, note:

    1) Single quotes around the label

    2) Variables will not be evaluated

    3) Control characters will not be evaluated

NOWDOC;

Referencing Characters in Strings – tham chiếu ký tự trong chuỗi

  • Bạn có thể tham chiếu một vị trí trong một chuỗi bằng cách sử dụng dấu ngoặc vuông hoặc dấu ngoặc nhọn để biểu thị vị trí số nguyên không dựa trên số mà bạn muốn tham chiếu.
<?php

$hello = "world";

echo $hello[0]; // w

echo $hello{1}; // o

Chú ý: hãy nhớ rằng các chuỗi là một chuỗi các byte và bạn đang tham chiếu đến vị trí byte. nếu bộ ký tự của bạn sử dụng nhiều hơn một byte cho mỗi ký tự, bạn sẽ không có kết quả mong đợi.

Trong phiên bản hiện tại của nó, PHP sẽ đưa ra một cảnh báo phạm vi nếu bạn cố gắng ghi vào một vị trí phủ định của một chuỗi, hoặc nếu bạn không chỉ định vị trí số nguyên.

Việc ghi vào một vị trí nằm ngoài phạm vi sẽ dẫn đến chuỗi được đệm với các khoảng trống để chứa phần thiếu.

<?php

$hello = "world";

$hello[10] = "*";

echo $hello; //  world     *

PHP and Multibyte Strings

  • PHP thực hiện chuỗi như là một mảng các byte với một số nguyên cho biết độ dài của bộ đệm (không phải là null kết thúc). PHP không lưu trữ thông tin về cách chuỗi được mã hóa.
  • Một lược đồ mã hóa có độ rộng biến đổi sử dụng các mã có độ dài khác nhau để mã hóa một bộ ký tự. Mã hóa nhiều byte sử dụng số lượng byte khác nhau để mã hóa các ký tự.
  • Mã hóa đa byte cho phép số lượng ký tự lớn hơn được mã hóa và được thể hiện trên máy tính. Một trong các lược đồ mã hóa mà bạn thường gặp phải trong PHP là UTF-8.2 Đây là lược đồ mặc định mà PHP sẽ cố gắng sử dụng để mã hóa nhiều byte.
  • Các hàm chuỗi gốc trong PHP giả định chuỗi là một mảng các byte đơn, vì vậy các hàm như substr (), strpos (), strlen () và strcmp () sẽ không hoạt động trên các chuỗi nhiều byte.
  • Bạn nên sử dụng tương đương multibyte của các hàm đó, ví dụ như mb_substr ().

Unicode

  • Unicode là một nỗ lực để thống nhất tất cả các bộ mã đại diện cho các ký tự. Unicode định nghĩa các codepoint là các khái niệm trừu tượng của một ký tự. Một codepoint Unicode đại diện cho một ký tự và được viết như thế này: U + 0041. Con số đó được gán cho vốn “A”.
  • Không có giới hạn về các ký tự mà Unicode có thể lưu trữ. Có một số nhầm lẫn ban đầu về Unicode là 2 byte, nhưng có liên quan đến lược đồ mã hóa và không phải là Unicode.

Note: Unicode không phải là hệ thống mã hóa. mã hóa là cách thức mà một ký tự Unicode được biểu diễn.

  • UTF-8 lưu trữ tất cả các điểm mã từ 0-127 trong một byte đơn. Điều này bao gồm toàn bộ phạm vi của bảng chữ cái tiếng Anh, số và một số biểu tượng. Codepoints trên 127 được lưu trữ trong nhiều byte (lên đến 6 byte).
  • Bởi vì các codepoint Unicode từ 0-127 khớp với bảng ASCII từ 0-127, văn bản tiếng Anh được mã hóa bằng UTF-8 trông giống hệt như được mã hóa trong ASCII.
  • Chỉ những người đã viết các ký tự có dấu trọng âm mới có thể kết thúc với một tệp được mã hóa khác với ASCII. Có hàng trăm lược đồ mã hóa có thể lưu trữ một số điểm mã Unicode, nhưng không phải tất cả.
  • Nếu bạn sử dụng một trong các mã hóa này và gặp phải một ký tự Unicode không thể được biểu diễn, bạn sẽ thấy dấu chấm hỏi hoặc một ô trống.
  • Ví dụ: nếu lược đồ mã hóa của bạn hướng đến việc lưu trữ các ký tự tiếng Do Thái và bạn cố gắng lưu trữ các ký tự tiếng Nga, bạn sẽ nhận được một loạt dấu hỏi thay vì ký tự tiếng Nga của bạn bởi vì lược đồ mã hóa không hỗ trợ chúng.

Telling Clients How a String Is Encoded

  • Bạn không thể phát hiện chắc chắn về cách chuỗi được mã hóa (trừ khi bạn tự mã hóa chuỗi) và không thể khách hàng nào tiêu thụ đầu ra của bạn. Trừ khi khách hàng biết chuỗi được mã hóa như thế nào, nó sẽ không thể hiển thị nó với sự tự tin. Đó là công việc của bạn với tư cách là một lập trình viên PHP để thông báo cho khách hàng đọc đầu ra HTML của bạn như thế nào nó được mã hóa.
  • Bạn nên chỉ định lược đồ mã hóa ký tự được sử dụng trong tiêu đề HTTP loại nội dung. Điều này cho phép khách hàng biết cách đầu ra của bạn được mã hóa và do đó làm thế nào để hiển thị nó một cách chính xác.
  • Đặt loại nội dung trong HTML dưới dạng thẻ meta hơi kém thỏa đáng bởi vì trừ khi khách hàng biết loại mã hóa, nó sẽ không thể đọc HTML để xác định mã hóa. Bạn có thể tránh xa bằng cách làm theo cách này, nhưng tốt hơn là không nên làm như vậy.

Changing Between Encoding Schemes  – Thay đổi giữa các lược đồ mã hóa

  • Phần mở rộng mbstring cung cấp một số hàm có thể được sử dụng để giúp phát hiện và chuyển đổi giữa các lược đồ mã hóa.
  • Hàm mb_detect_encoding () sẽ đi qua một danh sách các mã hóa có thể và cố gắng xác định chuỗi được mã hóa như thế nào.
  • Bạn có thể thay đổi thứ tự phát hiện bằng hàm mb_detect_order () hoặc bằng cách cung cấp danh sách mã hóa dưới dạng CSV hoặc mảng.
  • Bạn có thể sử dụng mb_convert_encoding () để chuyển đổi một chuỗi giữa các định dạng mã hóa.

Matching Strings

  • Việc so sánh các chuỗi trong PHP phải được thực hiện với mức độ chăm sóc thích hợp khi bạn đang cố gắng kết hợp các loại biến khác nhau. Trong chương 1, phần “Casting Variables”, chúng tôi đã xem xét các trang hướng dẫn liên quan đến truyền giá trị.
  • Hãy chắc chắn rằng bạn đã quen thuộc với cách PHP truyền giá trị các loại biến khác nhau thành chuỗi.
  • Sử dụng toán tử so sánh như> và <có thể không phải lúc nào cũng hoạt động như mong đợi. Người ta thường kỳ vọng rằng PHP sẽ sử dụng thứ tự bảng chữ cái để đánh giá các chuỗi chống lại các toán tử này.
  • Thay vì sử dụng sắp xếp theo thứ tự bảng chữ cái, PHP sử dụng giá trị ASCII của ký tự để so sánh. Chữ thường có giá trị ASCII cao hơn số vốn, vì vậy bạn có thể có trường hợp chữ thường được đặt sau chữ hoa, như sau:
<?php

$a = "PHP";

$b = "developer";

if ($a > $b) {

    echo "$a > $b";

} else {

    echo "$a < $b";

}

// developer comes before PHP in the alphabet

// but this script outputs

// PHP < developer
<?php

$a = "12 o'clock";

$b = 12.00;

if ($a == $b) {

    echo "The mouse ran up the clock";

}
  • strcmp () là một hàm để thực hiện so sánh chuỗi nhị phân an toàn. Nó lấy hai chuỗi làm đối số và trả về <0 nếu str1 nhỏ hơn str2; > 0 nếu str1 lớn hơn str2 và 0 nếu chúng bằng nhau.

Tip:  toán tử có thể được sử dụng trên bất kỳ loại biến nào, nhưng strcmp chỉ dành riêng cho chuỗi.

  • Ngoài ra còn có một phiên bản không phân biệt chữ hoa chữ thường có tên strcasecmp () đầu tiên chuyển đổi chuỗi thành chữ thường và sau đó so sánh chúng.

Ví dụ này cho thấy sự khác biệt:

<?php

$a = "PHP";

$b = "developer";

$comparison = strcmp($a, $b);

echo $comparison . PHP_EOL; // -20

$caseInsensitive = strcasecmp($a, $b);

echo $caseInsensitive . PHP_EOL; // 12
  • Các hàm strncmp () và strcasencmp () có thể được sử dụng để chỉ so sánh các ký tự “n” đầu tiên của hai chuỗi.
  • PHP có một hàm rất mạnh được gọi là same_text () để tính toán sự giống nhau giữa hai chuỗi. Đây có thể là một thủ tục rất tốn kém về mặt tính toán cho các phần văn bản dài, vì vậy hãy cẩn thận trước khi bạn sử dụng nó. Cũng lưu ý thứ tự
  • bạn vượt qua các đối số là quan trọng, vì vậy văn bản tương tự ($ a, $ b)! = same_ ($ b, $ a).
  • Một hàm khác, levenshtein (), có thể được sử dụng để tính khoảng cách Levenshtein giữa hai chuỗi. Khoảng cách Levenshtein được định nghĩa là số ký tự tối thiểu bạn phải thay thế, chèn hoặc xóa để biến str1 thành str2.
  • Để so sánh các chất nền, bạn có thể sử dụng hàm substr_compare () nhị phân an toàn.
  • PHP có hai chức năng cho phép bạn làm việc với cách một chuỗi âm thanh. Hàm soundex () tính toán một khóa dựa trên cách chuỗi âm thanh. Các chuỗi có âm giống nhau sẽ có cùng khóa âm thanh.
  • Hàm metaphone () tương tự tạo ra cùng khóa cho các chuỗi âm tương tự. Nó chính xác hơn soundex (), vì nó nhận thức được các quy tắc cơ bản của phát âm tiếng Anh. Tất nhiên, điều này có thể sẽ giúp ích rất ít cho các ngôn ngữ khác!
  • Có hai cách khác để so sánh các chuỗi, nhưng chúng được thảo luận trong Chương 6 về bảo mật. Hàm hash_equals () là một cách an toàn theo thời gian để so sánh các chuỗi và password_verify () là một cách an toàn để kiểm tra xem mật khẩu có khớp với một băm hay không. Bạn sẽ tìm hiểu về chúng chi tiết hơn sau này, nhưng hãy nhớ chúng như là các hàm chuỗi.

Extracting Strings – Trích xuất chuỗi

  • Một vị trí riêng lẻ trong một chuỗi có thể được tham chiếu với cùng một cú pháp như một phần tử mảng. Tất cả các vị trí trong chuỗi luôn luôn là zero-based — ký tự đầu tiên trong chuỗi là vị trí 0.
<?php

$string = 'abcdef';

echo $string[0];    // a
  • Bạn có thể sử dụng hàm substr () để trả về một phần hoặc một phần của một chuỗi.

Hướng dẫn sử dụng cho substr () hiển thị cú pháp cho lệnh như sau:

<?php

echo substr("abcdef", 2) . PHP_EOL;    // cdef

echo substr("abcdef", -2) . PHP_EOL;   // ef

echo substr("abcdef", 0, 2) . PHP_EOL;    // ab

echo substr("abcdef", 0, -2) . PHP_EOL;   // abcd

echo substr('abcdef', 1);     // bcdef

echo substr('abcdef', 1, 3);  // bcd

echo substr('abcdef', 0, 4);  // abcd

echo substr('abcdef', 0, 8);  // abcdef

echo substr('abcdef', -1, 1); // f

Tip: Xem thêm https://secure.php.net/manual/en/function.substr.php

Searching Strings – Tìm kiếm trong chuỗi

Useful Tips:

  • So sánh thứ tự các tham số được sử dụng cho strpos () và array_search ():

<?php

$arr = ['a', 'b', 'c', 'd', 'e', 'f' ];

$str = 'abcdef';

echo strpos($str, 'c') . PHP_EOL;

echo array_search('c', $arr) . PHP_EOL;
  • Mẹo hữu ích tiếp theo là ghi nhớ sự khác biệt giữa 0 và sai. Mặc dù Boolean false đánh giá là 0, nếu bạn chuyển nó thành số nguyên, thì số 0 không giống với sai Boolean.

Dưới đây là ví dụ mà dường như chúng tôi không tìm thấy chữ “a” trong chuỗi “abcdef”:

<?php

$string = 'abcdef';

if (strpos($string, 'a') == false) {
  echo "False negative!" . PHP_EOL;

}

=> Hãy nhớ rằng các chuỗi không dựa trên, vì vậy vị trí đầu tiên là vị trí 0. strpos () trả về số nguyên 0 vì nó tìm thấy “a” ở vị trí đầu tiên. Chúng tôi đang sử dụng toán tử equ = = để kiểm tra kết quả strpos () và vì vậy chúng tôi đang báo cáo sai rằng chữ “a” không xuất hiện trong chuỗi này.

Tip: để xử lý trường hợp chuỗi con không thực sự được tìm thấy, bạn nên sử dụng toán tử Identity ===.

Quick Overview of Search Functions  – Tổng quan nhanh về chức năng tìm kiếm

Replacing Strings

PHP có ba hàm để thay thế chuỗi.

  • str_replace () và phiên bản không phân biệt dạng chữ str_ireplace () có thể được sử dụng cho thay thế cơ bản.
<?php

echo str_replace('foo', 'bar', 'Delicious food'); // Delicious bard
  • Bạn có thể sử dụng hàm substr_replace () để thay thế các chất nền. substr_ replace () thay thế một bản sao của chuỗi được giới hạn bởi tham số bắt đầu và (tùy chọn) với chuỗi được đưa ra thay thế.
  • strtr () là một hàm khác để thay thế các phần tử và ký tự. Nếu chỉ có hai tham số được cung cấp, tham số thứ hai phải là một mảng các cặp thay thế. Nếu không có ba tham số, như trong ví dụ này từ Hướng dẫn sử dụng PHP, nó được sử dụng để chuyển đổi các ký tự có dấu trọng âm sang các ký tự định dạng tiếng Anh:
<?php

$address = "09479 Huopainenkylä, Pöhjois-Karjala";

$address = strtr($address, "äåö", "aao");

echo $address; // 09479 Huopainenkyloa, Pohjois-Karjala

=> Cách linh hoạt và mạnh mẽ nhất để thay thế chuỗi là sử dụng hàm preg_match (), cho phép bạn sử dụng các biểu thức chính quy để tìm các lát của chuỗi để thay thế. Bạn sẽ tìm hiểu thêm về các cụm từ thông dụng trong phần String Patterns: Regular Expressions ” ở phần sau của chương này.

Formatting Strings

  • Hàm printf () được sử dụng để xuất ra một chuỗi được định dạng. Bạn nên đọc kỹ Hướng dẫn sử dụng PHP7 và đảm bảo rằng bạn đã thực hành sử dụng nó. Cách sử dụng chung là chỉ định một chuỗi định dạng và các giá trị cần được đặt vào nó. (https://php.net/manual/en/function.printf.php )
<?php

$minutes = 60;

$timeUnit = "an hour";

printf("There are %u minutes in %s.", $minutes, $timeUnit);

Danh sách định dạng tham số:

  • Các định dạng PHP là nhận thức cục bộ, điều này ảnh hưởng đến cách chúng đại diện cho các số và ngày tháng.
<?php

// Set locale to Dutch

setlocale(LC_ALL, 'nl_NL');

// Output: vrijdag 22 december 1978

echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));

Formatting Numbers

  • Hàm number_format () là một cách đơn giản để định dạng các số. number_format () không phải là địa phương nhận thức và do đó sẽ không tự động chọn ký tự phân cách cho bạn.
  • Theo mặc định, dấu tách hàng nghìn là dấu phẩy và không có dấu thập phân nào được hiển thị.
  • Hàm này lấy các tham số cho số được định dạng, bao nhiêu vị trí thập phân để hiển thị, ký tự cho dấu thập phân và ký tự dấu tách hàng nghìn.
<?php

$number = 1234.5678;

// 1,235

echo number_format($number) . PHP_EOL;

// 1,234.568

echo number_format($number, 3) . PHP_EOL;

// 1.234,57

echo number_format($number, 2, ',', '.') . PHP_EOL;
  • Để định dạng tiền tệ, bạn có thể sử dụng hàm money_format (). Nó sẽ tự động nhận thiết lập mà máy chủ của bạn được cấu hình.
<?php

// Locale is British English

setlocale(LC_MONETARY, 'en_GB');

echo money_format('%.2n', "5000000.123"); //£5,000,000.12

// Locale is Denmark

setlocale(LC_MONETARY, 'da_DK');

echo money_format('%.2n', "5000000.123"); //kr 5.000.000,12

 

Hết phần 1

Tiếp tục theo dõi phần 2 tại: đây

 


Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *


« »

WP2Social Auto Publish Powered By : XYZScripts.com