Sự thay thế php của các biến trong một chuỗi. str_replace - Thay thế tất cả các lần xuất hiện của chuỗi tìm kiếm bằng chuỗi thay thế

Trộn preg_replace(mẫu hỗn hợp, thay thế hỗn hợp, chủ đề hỗn hợp [, int limit])

Chủ đề tìm kiếm các mẫu phù hợp và thay thế chúng bằng mẫu thay thế. Nếu tham số giới hạn được chỉ định, các lần xuất hiện giới hạn của mẫu sẽ được thay thế; nếu giới hạn bị bỏ qua hoặc bằng -1, tất cả các lần xuất hiện của mẫu sẽ được thay thế.

Thay thế có thể chứa các tham chiếu có dạng \\ n hoặc (kể từ PHP 4.0.4) $ n, ưu tiên sau này. Mỗi tham chiếu như vậy sẽ được thay thế bằng một chuỗi con tương ứng với chất con thứ n được đặt trong ngoặc đơn. N có thể nhận các giá trị từ 0 đến 99, với tham chiếu \\ 0 (hoặc $ 0) tương ứng với sự xuất hiện của toàn bộ mẫu. Các chất con được đánh số từ từ trái sang phải, bắt đầu từ một.

Khi sử dụng thay thế ký tự đại diện bằng cách sử dụng tham chiếu phân tử, có thể xảy ra tình huống trong đó một chữ số ngay sau mặt nạ. Trong trường hợp này, ký hiệu \\ n dẫn đến lỗi: tham chiếu đến chất liệu con đầu tiên theo sau là 1 sẽ được viết là \\ 11, sẽ được hiểu là tham chiếu đến chất liệu con thứ mười một. Sự hiểu lầm này có thể được loại bỏ bằng cách sử dụng cấu trúc \ $ (1) 1, nó trỏ đến một tham chiếu riêng biệt tới chất con đầu tiên, theo sau là chữ số 1.

Kết quả của ví dụ này sẽ là:

1 tháng 4 năm 2003

Nếu tìm thấy khớp mẫu trong quá trình thực thi hàm, giá trị đã sửa đổi của chủ đề sẽ được trả về, nếu không, văn bản gốc của chủ đề sẽ được trả về.

Ba tham số đầu tiên của hàm preg_replace () có thể là mảng một chiều. Nếu mảng sử dụng các khóa, thì khi xử lý mảng, chúng sẽ được lấy theo thứ tự nằm trong mảng. Chỉ định các khóa trong mảng cho mẫu và thay thế là tùy chọn. Nếu bạn vẫn quyết định sử dụng chỉ mục, hãy sử dụng hàm để khớp các mẫu và chuỗi liên quan đến việc thay thế. ksort () cho mỗi mảng.


Ví dụ 2: Sử dụng Mảng có Chỉ số Số làm Đối số Hàm preg_replace ()

$ string = "Con cáo nâu nhanh nhẹn nhảy qua thân con chó lười."; $ pattern [0] = "/ nhanh /";
$ pattern [1] = "/ brown /";
$ pattern [2] = "/ fox /"; $ Replacements [2] = "bear";
$ thay thế [1] = "đen";
$ Replacements [0] = "slow"; preg_replace ($ mẫu, $ thay thế, $ string);
?>

Kết quả:

Kết quả:

Con gấu đen chậm chạp nhảy qua con chó lười biếng.

Nếu tham số chủ đề là một mảng, thì việc tìm kiếm và thay thế mẫu được thực hiện cho từng phần tử của nó. Kết quả trả về cũng sẽ là một mảng.

Trong trường hợp mẫu tham số và thay thế là mảng, preg_replace () lần lượt trích xuất một cặp phần tử từ cả hai mảng và sử dụng chúng cho hoạt động tìm kiếm và thay thế. Nếu mảng thay thế chứa nhiều phần tử hơn mẫu, các chuỗi trống sẽ được lấy thay vì các phần tử bị thiếu để thay thế. Nếu mẫu là một mảng và thay thế là một chuỗi, thì mỗi phần tử của mẫu sẽ được tìm kiếm và thay thế bằng mẫu (mẫu sẽ lần lượt là tất cả các phần tử của mảng, trong khi chuỗi thay thế vẫn cố định). Tùy chọn khi mẫu là một chuỗi và thay thế là một mảng không có ý nghĩa.

Bổ ngữ / e thay đổi hoạt động của hàm preg_replace () theo cách mà tham số thay thế, sau khi thực hiện các thay thế cần thiết, được hiểu là mã PHP và sau đó chỉ được sử dụng để thay thế. Khi sử dụng công cụ sửa đổi này, hãy cẩn thận: tham số thay thế phải chứa mã PHP hợp lệ, nếu không trong dòng chứa lệnh gọi hàm preg_replace (), một lỗi cú pháp sẽ xảy ra.


Ví dụ 3: Thay thế bằng nhiều mẫu

$ pattern = array ( "/ (19 | 20) (\ d (2)) - (\ d (1,2)) - (\ d (1,2)) /",
"/ ^ \ s * ((\ w +)) \ s * = /");
$ Replace = array ("\\ 3 / \\ 4 / \\ 1 \\ 2", "$ \\ 1 =");
echo preg_replace ($ pattern, $ Replace, "(startDate) = 1999-5-27");
?>

Ví dụ này sẽ xuất ra:

Chuyển đổi tất cả các thẻ HTML thành chữ hoa


Ví dụ 5. Trình chuyển đổi HTML sang văn bản

// Đầu ra $ document phải chứa một tài liệu HTML.
// Cần xóa tất cả các thẻ HTML, các phần javascript,
// ký tự khoảng trắng. Nó cũng cần thiết để thay thế một số
// Các thực thể HTML tương đương với chúng.
$ search = array ( ""]*?>.*?"si", // Cắt bỏ javaScript
""<[\/\!]*?[^<>] *?> "si", // Tách thẻ HTML
"" ([\ r \ n]) [\ s] + "", // Xóa các ký tự khoảng trắng
"" & (quot | # 34); "i", // Thay thế các thực thể HTML
"" & (amp | # 38); "i",
"" & (lt | # 60); "i",
"" & (gt | # 62); "i",
"" & (nbsp | # 160); "i",
"" & (iexcl | # 161); "i",
"" & (xu | # 162); "i",
"" & (bảng Anh | # 163); "i",
"" & (bản sao | # 169); "i",
"" (\ d +); "e"); // diễn giải dưới dạng mã php$ Replace = array ("",
"" ,
"\\1" ,
"\"" ,
"&" ,
"<" ,
">" ,
" " ,
chr (161),
chr (162),
chr (163),
chr (169),
"chr (\\ 1)"); $ text = preg_replace ($ search, $ Replace, $ document);
?>

Tất nhiên, hình ảnh, tệp âm thanh, thông tin video, dữ liệu hoạt ảnh và ứng dụng tạo nên một phần quan trọng trong nội dung của World Wide Web, nhưng phần lớn dữ liệu trên Web vẫn ở dạng văn bản - chuỗi ký tự thích câu này. Kiểu dữ liệu PHP cơ bản để biểu diễn văn bản là một chuỗi.

Mô tả các chuỗi trong PHP

Chuỗi là chuỗi ký tự có thể được coi như một thực thể duy nhất - được gán cho các biến, được chuyển làm đầu vào cho các hàm, trả về từ các hàm hoặc được gửi dưới dạng đầu ra để hiển thị trên trang web của người dùng. Cách đơn giản nhất để chỉ định một chuỗi trong mã PHP là đặt một chuỗi ký tự trong dấu ngoặc kép, ví dụ: đơn ("") hoặc kép ("), như sau:

$ myString = "Chuỗi đơn giản"; $ anotherString = "Một chuỗi khác";

Sự khác biệt giữa dấu ngoặc kép và dấu ngoặc kép là do môi trường PHP diễn giải các ký tự được trích dẫn trước khi tạo chuỗi thực sự rộng rãi như thế nào. Nếu chuỗi được đặt trong dấu ngoặc kép, thì hầu như không có diễn giải nào được thực hiện và nếu chuỗi được đặt trong dấu ngoặc kép, thì môi trường PHP thực hiện thay thế các giá trị của tất cả các biến được chỉ định trong chuỗi, đồng thời thay thế một số chuỗi ký tự đặc biệt bắt đầu bằng ký tự gạch chéo ngược ().

Ví dụ: sau khi xử lý mã sau đây là một phần của trang web:

$ đếm = 13; $ string1 = "Chuỗi \" Hello, world! \ "chứa $ count ký tự.
"; $ string2 =" Chuỗi \ "Hello, world! \" chứa $ count ký tự.
"; echo $ string1; echo $ string2;

bạn có thể mong đợi nhận được kết quả sau trong cửa sổ trình duyệt:

Thay thế giá trị bằng cách sử dụng dấu ngoặc nhọn

Trong hầu hết các tình huống, bạn có thể chỉ cần đặt biến trong một chuỗi có dấu ngoặc kép và giá trị của biến sẽ được thay thế vào chuỗi khi trình thông dịch xử lý chuỗi. Nhưng trong hai tình huống được mô tả bên dưới, có thể trình thông dịch chuỗi không thể đưa ra quyết định sáng suốt và cần hướng dẫn bổ sung từ nhà phát triển.

Tình huống đầu tiên là trình thông dịch không thể xác định vị trí kết thúc của tên biến và tình huống thứ hai xảy ra khi cần thay thế trong chuỗi không phải giá trị của một biến đơn giản mà là giá trị của một biểu thức. Trong những trường hợp này, nhà phát triển có thể làm rõ bằng cách đặt tên hoặc biểu thức cần xử lý trong dấu ngoặc nhọn (()).

Ví dụ: trình thông dịch PHP không có vấn đề gì khi xử lý đoạn mã sau:

$ sport = "bóng chuyền"; $ play = "Tôi thích chơi $ sport.";

Trong những trường hợp như vậy, trình thông dịch gặp ký tự $, sau đó bắt đầu xâu chuỗi con của các ký tự để hiển thị tên biến và làm như vậy cho đến khi nó gặp một khoảng trắng hoặc dấu chấm theo sau tên biến $ sport. Dấu cách và dấu chấm không thể là một phần của tên biến, vì vậy rõ ràng biến được đề cập có tên là $ sport; trình thông dịch PHP sau đó tìm thành công một giá trị cho biến đã cho ("bóng chuyền") và thay thế nó.

Nhưng đôi khi không thể đánh dấu phần cuối của tên biến bằng dấu cách hoặc dấu chấm. Hãy xem xét ví dụ sau:

$ sport1 = "sẽ"; $ sport2 = "chân"; $ sport3 = "giỏ"; // Cấu trúc sai $ play1 = "Tôi thích chơi $ sport1ball."; $ play2 = "Tôi thích chơi $ sport2ball."; $ play3 = "Tôi thích chơi $ sport3ball.";

Trong trường hợp này, hiệu quả mong muốn sẽ không đạt được, vì trình thông dịch PHP sẽ coi chuỗi $ sport1 là một phần của tên biến $ sport1bol, dường như chưa được gán bất kỳ giá trị nào. Thay vào đó, bạn cần sử dụng ký hiệu sau:

// Cấu tạo hợp lệ $ play1 = "Tôi thích chơi ($ sport1) ball."; $ play2 = "Tôi thích chơi bóng ($ sport2)."; $ play3 = "Tôi thích chơi bóng ($ sport3).";

Ký hiệu này cho trình thông dịch PHP biết rằng chỉ giá trị của biểu thức có tên biến được đặt trong dấu ngoặc nhọn mới cần được đánh giá trước khi thay thế giá trị.

Vì những lý do tương tự, trình thông dịch PHP, nếu không sử dụng dấu ngoặc nhọn, sẽ gặp khó khăn khi thay thế giá trị của biểu thức phức tạp bằng tên biến, chẳng hạn như truy cập các phần tử của mảng đa chiều và biến đối tượng. Quy tắc chung là nếu một dấu ngoặc nhọn mở (() ngay sau đó là $, thì trình thông dịch PHP sẽ đánh giá giá trị của biểu thức với tên biến cho đến dấu ngoặc nhọn đóng ()), và sau đó thay thế giá trị kết quả vào chuỗi. (Nếu bạn muốn một giá trị chữ ($) xuất hiện trong chuỗi, điều này có thể được thực hiện bằng cách đặt trước mỗi ký tự này bằng một dấu gạch chéo ngược, \).

Các ký tự và chỉ số ký tự trong chuỗi

Không giống như một số ngôn ngữ lập trình khác, PHP không có kiểu ký tự riêng không giống kiểu chuỗi. Nói chung, các hàm yêu cầu các tham số thực của ký tự trong các ngôn ngữ khác được thiết kế để lấy các chuỗi có độ dài 1 trong PHP.

Việc chọn các ký tự riêng lẻ từ một chuỗi có thể được thực hiện bằng cách chỉ định một ký tự thứ tự dựa trên 0, ký tự này phải được chỉ định trong dấu ngoặc nhọn ngay sau tên của biến chuỗi. Các ký tự như vậy thực sự là các chuỗi ký tự đơn. Ví dụ: chạy đoạn mã sau:

$ myString = "Tăng gấp đôi"; cho ($ index = 0; $ index< strlen($myString); $index++) { $char = $myString{$index}; print("$char$char"); }

dẫn đến kết quả sau trong cửa sổ trình duyệt:

Rõ ràng, mỗi ký tự của chuỗi được in hai lần trên mỗi lần đi qua vòng lặp. Hàm strlen () trả về độ dài của một chuỗi.

Hoạt động chuỗi

PHP cung cấp hai phép toán chuỗi: toán tử dấu chấm (.) Hoặc toán tử nối, và toán tử dấu chấm và dấu bằng (. =), Hoặc toán tử nối và gán. Hãy xem xét ví dụ sau:

$ string1 = "Đây là một phần"; $ string2 = "chuỗi"; // Nối chuỗi echo $ string1. "Simple". $ String2. "
"; //" Đây là một phần của chuỗi đơn giản "// Nối và gán $ string1. =" Simple "; // Tương đương với $ string1 = $ string1." simple "; $ string1. = $ string2; echo $ string1; //" Đây là một phần của một chuỗi đơn giản "

Cần lưu ý rằng trong ví dụ trên, câu lệnh echo đầu tiên không được truyền nhiều tham số thực tế của chuỗi; chỉ có một tham số thực sự của chuỗi được truyền, là kết quả của việc nối bốn chuỗi. Dòng đầu tiên và dòng thứ ba được đặt bằng cách sử dụng các biến, dòng thứ hai và thứ tư là một chuỗi ký tự được đặt trong dấu ngoặc kép.

Cấu trúc cú pháp tài liệu con (Heredoc)

Ngoài các cấu trúc cú pháp của chuỗi trong dấu ngoặc kép và đơn, PHP cung cấp một cách khác để chỉ định một chuỗi, được gọi là cấu trúc cú pháp của tài liệu lồng nhau (Heredoc). Hóa ra, cấu trúc cú pháp như vậy là một phương tiện rất thuận tiện để chỉ định các đoạn văn bản lớn được thay thế bằng cách sử dụng các biến, vì nó loại bỏ sự cần thiết của người dùng để chỉ định các dấu ngoặc kép bên trong bằng cách sử dụng các ký tự đặc biệt. Phương pháp này đặc biệt hữu ích khi tạo các trang có chứa các biểu mẫu HTML.

Ký hiệu toán tử được sử dụng trong cấu trúc cú pháp của tài liệu con là (<<<). За этим знаком должна непосредственно следовать метка (не заключенная в кавычки), которая обозначает начало многострочного текста. Интерпретатор PHP продолжает включать в состав значения переменной следующие строки до тех пор, пока снова не появится эта же метка в начале строки. За заключительной меткой может следовать необязательная точка с запятой, а какие-либо другие символы после метки не допускаются.

Hãy xem xét ví dụ sau:

$ string =<<

BẤT TỬ; echo $ string;

Lưu ý rằng từ EOT cuối cùng hiển thị ở trên không được thụt vào, nếu không nó sẽ được coi là thuộc về văn bản bổ sung được bao gồm. Không nhất thiết phải sử dụng từ "EOT" làm nhãn, nhãn có thể có bất kỳ tên nào, tuân theo các quy ước đặt tên biến PHP thông thường.

Việc thay thế biến được thực hiện bằng phương pháp chính xác giống như khi sử dụng các chuỗi được đặt trong dấu ngoặc kép. Một tính năng thuận tiện của tài liệu phụ là dấu ngoặc kép có thể được nhập vào văn bản được chỉ định theo cách này mà không cần sử dụng bất kỳ ký tự điều khiển nào và điều này không dẫn đến việc hoàn thành sớm quá trình tạo dòng. Ví dụ được hiển thị ở trên xuất ra một biểu mẫu HTML đơn giản:

Hàm chuỗi

Ngôn ngữ PHP cung cấp nhiều chức năng để xử lý và chuyển đổi chuỗi. Nếu bạn có nhu cầu tạo hàm của riêng mình để đọc và xử lý từng ký tự của chuỗi để tạo thành chuỗi mới, trước tiên hãy xem xét liệu ai đó có thể đã phải đối mặt với một nhiệm vụ tương tự trước đây hay không. Và nếu trực giác gợi ý rằng một khả năng như vậy tồn tại, thì có lẽ đã có một chức năng tích hợp sẵn để giải quyết vấn đề. Để biết thêm thông tin về các hàm chuỗi, vui lòng tham khảo https://php.net/manual/en/ref.strings.php.

Phần này giới thiệu các chức năng cơ bản để kiểm tra, so sánh, sửa đổi và in các chuỗi. Để thực sự thành thạo các phương tiện thao tác chuỗi của PHP, có vẻ như người ta phải có ít nhất một kiến ​​thức sơ lược về mọi thứ được đề cập trong phần này. Bạn có thể tìm thấy mô tả về các hàm được thiết kế để hoạt động với biểu thức chính quy trong bài viết sau.

Xác thực chuỗi

Những câu hỏi phổ biến nhất về chuỗi cần được trả lời là gì? Đầu tiên trong danh sách các câu hỏi là câu hỏi về độ dài của một chuỗi; để trả lời nó, hàm strlen () được sử dụng, tên của nó là chữ viết tắt của string length - độ dài của chuỗi. Dưới đây là một ví dụ về việc sử dụng một hàm như vậy:

$ enStr = "Xin chào mọi người!"; $ rusStr = "Chuỗi đơn giản"; echo $ enStr. "-" .strlen ($ enStr). "ký tự
"; echo $ rusStr." - ".strlen ($ rusStr)." nhân vật";

Chạy mã này tạo ra kết quả không rõ ràng sau:

Như bạn có thể thấy, đối với chuỗi "Hello world!" kết quả là đúng, nhưng đối với chuỗi "Chuỗi đơn giản", kết quả của 27 ký tự là không chính xác. Vấn đề ở đây là gì? Thực tế là hàm strlen () đếm byte chứ không phải ký tự. Trong trường hợp đầu tiên, tất cả các ký tự trong chuỗi đều bằng tiếng Anh, tức là được biểu diễn bằng mã hóa ASCII và được mã hóa dưới dạng 1 byte. Trong trường hợp thứ hai, chuỗi chứa các ký tự tiếng Nga, được mã hóa bằng 2 byte (UTF-8). Để tránh các vấn đề sau này khi làm việc với các hàm chuỗi, PHP nên sử dụng các hàm cho mã hóa nhiều byte bắt đầu bằng tiền tố mb_. Điều này có nghĩa là trong ví dụ trước, bạn cần thay thế hàm strlen () bằng mb_strlen () và chỉ định rõ ràng kiểu mã hóa:

Echo $ rus_str. "-" .mb_strlen ($ rus_str, "UTF8"). "Ký tự";

Tìm ký tự và chuỗi con

Câu hỏi tiếp theo liên quan đến các chuỗi là chúng chứa những gì. Ví dụ: hàm strpos () cho phép bạn tìm số vị trí của một ký tự cụ thể trong một chuỗi, nếu có:

$ enStr = "Xin chào mọi người!"; echo "Ký hiệu" l ":" .strpos ($ enStr, "l"); // 2

Các tình huống liên quan đến việc sử dụng hàm strpos () là các trường hợp mà sự không nhạy về kiểu của PHP có thể là một vấn đề. Nếu không tìm thấy kết quả khớp, thì hàm trả về giá trị sai và nếu ký tự mong muốn khớp với ký tự đầu tiên trong chuỗi, thì hàm trả về 0 (vì vị trí ký tự trong chuỗi bắt đầu từ 0, không phải từ 1) . Cả hai giá trị này đều tương ứng với false khi được sử dụng để kiểm tra điều kiện boolean. Một cách để phân biệt giữa các giá trị này là sử dụng toán tử so sánh danh tính (toán tử ===, được giới thiệu từ PHP4), toán tử này chỉ trả về true nếu các toán hạng của nó giống nhau và cùng kiểu. Toán tử so sánh danh tính có thể được sử dụng để kiểm tra xem giá trị trả về là 0 (hoặc sai) mà không có nguy cơ nhầm lẫn giá trị trả về với các giá trị khác có thể trở nên giống nhau sau khi ép kiểu.

Hàm strpos () cũng có thể được sử dụng để tìm kiếm một chuỗi con thay vì một ký tự đơn lẻ. Để thực hiện điều này, chỉ cần chỉ định một chuỗi nhiều ký tự chứ không phải một chuỗi một ký tự như mong muốn là đủ. Ngoài ra, trong lệnh gọi hàm này, bạn có thể chỉ định một tham số số nguyên bổ sung chỉ định vị trí bắt đầu tìm kiếm.

Cũng có thể tìm kiếm theo hướng ngược lại, từ cuối chuỗi đến đầu. Hàm strrpos () được sử dụng cho việc này. (Lưu ý rằng hàm này có thêm r trong tên của nó, viết tắt của hàm ngược.) Hàm này nhận tham số là chuỗi cần tìm kiếm và chuỗi ký tự đơn để tìm kiếm, sau đó trả về vị trí xuất hiện cuối cùng của tham số thứ hai trong tham số đầu tiên. (Không giống như hàm strpos (), trong hàm strrpos (), chuỗi được tìm kiếm chỉ được chứa một ký tự.) Sau khi áp dụng hàm này với các tham số giống như trong ví dụ trước, một vị trí khác sẽ được tìm thấy:

$ enStr = "Xin chào mọi người!"; echo "Ký hiệu" l ":" .strrpos ($ enStr, "l"); // 9 bởi vì tìm kiếm từ cuối chuỗi

So sánh

Dòng đó có khớp với dòng này không? Rõ ràng, mã thường phải trả lời câu hỏi này, đặc biệt là khi nói đến việc xử lý đầu vào từ người dùng cuối.

Phương pháp đơn giản nhất để tìm câu trả lời cho câu hỏi liệu các chuỗi có giống nhau hay không là sử dụng toán tử so sánh đẳng thức đơn giản (==), toán tử này kiểm tra sự bằng nhau không chỉ của chuỗi mà còn của số. Khi sử dụng toán tử ==, hai chuỗi được coi là giống nhau nếu chúng chứa chính xác các chuỗi ký tự giống nhau. Điều này không kiểm tra định nghĩa nghiêm ngặt hơn về các chuỗi giống hệt nhau, chẳng hạn như điều kiện rằng các chuỗi này được lưu trữ tại cùng một địa chỉ trong bộ nhớ, nhưng có phân biệt chữ hoa chữ thường (nói cách khác, cho dù các chữ cái được so sánh là chữ hoa hay chữ thường).

Kết quả so sánh hai chuỗi sử dụng toán tử == (hoặc các toán tử tương ứng< и >) chỉ có thể được tin cậy nếu cả hai toán hạng đều là chuỗi và biết rằng không có chuyển đổi kiểu nào xảy ra. Và kết quả của việc kiểm tra bằng cách sử dụng hàm strcmp (), được mô tả dưới đây, luôn có thể được tin cậy.

Hàm so sánh chuỗi quan trọng nhất thực hiện hầu hết công việc là strcmp (). Hàm này nhận hai chuỗi làm tham số và so sánh từng byte cho đến khi tìm thấy sự khác biệt. Sau đó, hàm trả về một số âm nếu chuỗi đầu tiên nhỏ hơn chuỗi thứ hai và một số dương nếu chuỗi thứ hai nhỏ hơn chuỗi đầu tiên. Nếu các chuỗi giống nhau, hàm strcmp () trả về giá trị không.

Hàm strcasecmp () hoạt động theo cách tương tự, ngoại trừ việc so sánh bình đẳng là không phân biệt chữ hoa chữ thường. Ví dụ: một lệnh gọi tới strcasecmp ("hey!", "HEY!") Sẽ trả về 0.

Tìm kiếm

Các hàm so sánh vừa mô tả cho bạn biết liệu một chuỗi có bằng một chuỗi khác hay không. Và để xác định xem một chuỗi có được chứa trong chuỗi khác hay không, hãy sử dụng hàm strpos () được mô tả ở trên hoặc hàm strstr () và các hàm tương tự.

Hàm strstr () nhận làm tham số cho chuỗi được tìm kiếm và chuỗi được tìm kiếm (theo thứ tự đó). Nếu thành công, hàm này trả về phần của chuỗi bắt đầu bằng lần xuất hiện đầu tiên của chuỗi tìm kiếm (và bao gồm cả chuỗi tìm kiếm). Nếu không tìm thấy chuỗi nào như vậy, hàm trả về false. Đoạn mã sau cung cấp các ví dụ về cách sử dụng hàm này:

$ str = "Xin chào thế giới!"; $ findStr = "thế giới"; echo "Chuỗi con" $ findStr"trong chuỗi ban đầu:" .strstr ($ str, $ findStr);

Giống như hàm strcmp (), hàm strstr () có một phiên bản không phân biệt chữ hoa chữ thường được gọi là stristr () (chữ i trong tên đó là viết tắt của insensitive). Hàm stristr () giống với hàm strstr () ở mọi khía cạnh, ngoại trừ việc so sánh coi các chữ cái thường là chữ hoa đối của chúng.

Lấy mẫu chuỗi con

Nhiều hàm chuỗi PHP thực hiện các thao tác cắt và dán trên chuỗi. Cắt là một lựa chọn của một phần của chuỗi và chèn là một sửa đổi có chọn lọc của một chuỗi. Hãy nhớ rằng ngay cả các hàm chèn (thường xuyên nhất) cũng không sửa đổi chuỗi được cung cấp dưới dạng tham số đầu vào. Thông thường, các hàm như vậy trả về một bản sao đã sửa đổi và giữ nguyên tham số ban đầu.

Cách đơn giản nhất để lấy mẫu một phần của chuỗi là sử dụng hàm substr (), hàm này trả về một chuỗi mới chứa một phần của dãy con các ký tự từ chuỗi cũ. Hàm substr () nhận dưới dạng các tham số là một chuỗi (từ đó chuỗi con sẽ được lấy mẫu), một số nguyên (vị trí mà tại đó chuỗi con mong muốn bắt đầu) và một số nguyên tùy chọn tham số thứ ba chỉ định độ dài của chuỗi con mong muốn. Nếu tham số thứ ba không được chỉ định, thì chuỗi con được coi là tiếp tục đến cuối chuỗi. (Cần nhớ rằng khi sử dụng hàm này, việc đánh số các vị trí trong một dòng bắt đầu từ 0 chứ không phải từ một, như trong tất cả các tham số hàm PHP biểu thị các vị trí số trong chuỗi.) Ví dụ:

$ str = "Xin chào thế giới!"; echo mb_substr ($ str, 7, 3, "UTF8"); // "hòa bình"

Cả tham số vị trí bắt đầu và tham số độ dài đều có thể âm, nhưng trong cả hai trường hợp này, giá trị âm có một ý nghĩa khác. Nếu vị trí bắt đầu là số âm, thì vị trí của ký tự bắt đầu của chuỗi con được xác định bằng cách đếm ngược từ cuối chuỗi, thay vì đếm ngược từ đầu chuỗi. (Vị trí bắt đầu là -1 cho biết rằng số lượng bắt đầu từ ký tự cuối cùng, giá trị -2 cho biết ký tự áp chót, v.v.)

Dựa trên điều này, người ta có thể giả định rằng giá trị độ dài âm cũng ngụ ý rằng chuỗi con nên được xác định bằng cách đếm ngược từ ký tự bắt đầu, thay vì đếm ngược, nhưng không phải vậy. Khẳng định rằng ký tự ở vị trí bắt đầu là ký tự đầu tiên trong chuỗi trả về (và không phải ký tự cuối cùng) luôn đúng. Thay vào đó, tham số độ dài âm có nghĩa là ký tự kết thúc được xác định bằng cách đếm ngược từ cuối chứ không phải đếm ngược từ vị trí bắt đầu.

Dưới đây là một số ví dụ với các tham số tích cực và tiêu cực:

$ str = "Xin chào thế giới!"; echo mb_substr ($ str, 7, 3, "UTF8"). "
"; //" thế giới "echo mb_substr ($ str, -4, 3," UTF8 ")."
"; //" thế giới "echo mb_substr ($ str, 0, -5," UTF8 ")."
"; // "Này"

Xóa khoảng trắng và tab khỏi chuỗi

Về mặt kỹ thuật, các hàm chop (), ltrim () và trim () là các hàm để làm việc với các chuỗi con (giống như các hàm khác), nhưng trên thực tế, các hàm này được thiết kế để loại bỏ các ký tự không mong muốn khỏi chuỗi. Các hàm chop (), ltrim () và trim () tương ứng loại bỏ các ký tự khoảng trắng ở cuối, ở đầu, ở đầu và ở cuối khỏi một chuỗi được cho làm tham số chuỗi duy nhất.

Ngoài dấu cách, các hàm này loại bỏ các ký tự khoảng trắng khác, chẳng hạn như các ký tự được chỉ ra bởi chuỗi thoát \ n, \ r, \ t và \ 0 (ký tự cuối dòng, tab và ký tự rỗng được sử dụng để đánh dấu phần cuối của một dòng trong chương trình C).

Trong PHP, người ta thường sử dụng hàm để loại bỏ khoảng trắng ở cuối chuỗi, được gọi là chop (), nhưng một hàm giống hệt, có tên mô tả hơn là rtrim (), cũng có thể được gọi. Cuối cùng, cần lưu ý rằng hàm chop (), mặc dù thực tế là tên của nó, có nghĩa là "cắt nhỏ", nghe có vẻ rất đe dọa, nhưng không làm hỏng tham số $ gốc ban đầu, tham số này vẫn giữ nguyên giá trị trước đó.

Thay thế chuỗi

Tất cả các hàm chuỗi được thảo luận ở trên được cung cấp để tìm nạp một phần của tham số đầu vào, thay vì tạo thành một chuỗi hoàn toàn mới. Phần này thảo luận về các hàm str_replace () và substr_replace () cho mục đích này.

Hàm str_replace () cho phép bạn thay thế tất cả các lần xuất hiện của một chuỗi con cụ thể đã cho bằng một chuỗi khác. Hàm này nhận ba tham số: chuỗi được tìm kiếm, chuỗi con được thay thế sau khi tìm thấy và chuỗi được sử dụng để thay thế. Hãy xem xét ví dụ sau:

$ str = "Xin chào thế giới!"; echo str_replace ("thế giới", "hành tinh", $ str); // "Xin chào hành tinh!"

Việc thay thế được thực hiện trên tất cả các lần xuất hiện của chuỗi con được tìm thấy trong chuỗi tìm kiếm. Nếu ví dụ trên được sử dụng để thay thế tên của một thành phố trong một bách khoa toàn thư lỗi thời, thì sau khi chuyển toàn bộ văn bản của bách khoa thành một dòng PHP, việc thay thế toàn bộ văn bản như vậy có thể được thực hiện trong một lần chuyển.

Như được hiển thị ở trên, hàm str_replace () chọn phần của chuỗi nguồn sẽ được thay thế bằng cách tìm kiếm sự xuất hiện của chuỗi con mong muốn trong chuỗi nguồn; ngược lại, substr_replace () chọn phần sẽ được thay thế bằng vị trí tuyệt đối của nó. Hàm này sử dụng tối đa bốn tham số: chuỗi được thay thế, chuỗi được sử dụng để thay thế, vị trí bắt đầu của sự thay thế và (như một tham số tùy chọn) độ dài của phần chuỗi được thay thế. Hãy xem xét ví dụ sau:

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

Phần CDE của chuỗi đã được thay thế bằng một ký tự duy nhất. Lưu ý rằng trong trường hợp này, nó được phép thay thế một chuỗi con bằng một chuỗi có độ dài khác. Nếu tham số độ dài bị bỏ qua, thì toàn bộ phần của chuỗi sau vị trí bắt đầu được giả định sẽ được thay thế.

Hàm substr_replace () cũng chấp nhận các tham số âm làm vị trí và độ dài bắt đầu, được xử lý chính xác như trong hàm substr () ở trên. Điều quan trọng cần nhớ là do kết quả của các hoạt động được thực hiện bằng cách sử dụng các hàm str_replace và substr_replace, chuỗi ban đầu vẫn không thay đổi.

Cuối cùng, có một số hàm ít được sử dụng rộng rãi hơn tạo thành chuỗi mới từ các hàm cũ. Hàm strrev () chỉ đơn giản trả về một chuỗi mới với các ký tự trong chuỗi đầu vào được đảo ngược. Hàm str_repeat () nhận một chuỗi và một tham số số nguyên và trả về một chuỗi chứa số lượng bản sao được chỉ định của tham số chuỗi:

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

Các chức năng chuyển đổi trường hợp

Các hàm này cho phép bạn chuyển đổi chữ thường thành chữ hoa và ngược lại. Hàm strtolower () trả về một chuỗi có tất cả các chữ cái được chuyển thành chữ thường. Không quan trọng là chuỗi ban đầu chỉ chứa chữ hoa hay chữ hoa và chữ thường. Ví dụ:

$ str = "Xin chào thế giới!"; echo mb_strtolower ($ str, "UTF8"); // "Chào thế giới!"

Nếu bạn đã từng trải qua việc phải thực hiện nhiều xác thực biểu mẫu, bạn có thể nhận thấy rằng hàm strtolower () là một công cụ cực kỳ tiện dụng để xử lý các địa chỉ email nhận được từ những người dùng vẫn không biết rằng các địa chỉ email đó là chữ thường. -vô cảm. Không kém phần hữu ích là các chức năng khác liên quan đến danh mục này.

Hàm strtoupper () trả về một chuỗi có tất cả các chữ cái được chuyển thành chữ hoa. Một ví dụ là đoạn mã sau:

$ str = "Xin chào thế giới!"; echo mb_strtoupper ($ str, "UTF8"); // "CHÀO THẾ GIỚI!"

Hàm ucfirst () chỉ viết hoa chữ cái đầu tiên của chuỗi, hàm ucwords () viết hoa chữ cái đầu tiên của mọi từ trong chuỗi. Cả hàm ucwords () và ucfirst () đều không có chức năng tương tự đối với mã hóa multibyte, vì vậy chúng không tương thích với chuỗi Cyrillic.

Các chức năng giới thiệu các ký tự điều khiển

Một trong những ưu điểm của ngôn ngữ PHP là nó có thể được sử dụng để trao đổi dữ liệu với hầu hết mọi hệ thống. Các phương tiện loại này thường được coi là một loại "keo phần mềm". Với vai trò này, ngôn ngữ PHP được sử dụng để tương tác với các máy chủ cơ sở dữ liệu, máy chủ LDAP, để trao đổi dữ liệu thông qua các ổ cắm và chính kết nối HTTP. Thường thì sự tương tác này được thực hiện bằng cách đầu tiên tạo một chuỗi thông báo (giống như một truy vấn cơ sở dữ liệu) và sau đó chuyển thông báo đó đến chương trình nhận. Nhưng các chương trình thường mang lại ý nghĩa đặc biệt cho một số ký tự, và do đó chúng phải được chuyển đổi thành các ký tự điều khiển. Điều này có nghĩa là chương trình nhận được hướng dẫn xử lý các ký tự như một phần theo nghĩa đen của chuỗi, thay vì áp dụng cách xử lý đặc biệt cho chúng.

Nhiều người dùng, để giải quyết vấn đề này, cho phép sử dụng cái gọi là "chế độ trích dẫn ma thuật", đảm bảo rằng các dấu ngoặc kép được chuyển đổi thành các ký tự điều khiển trước khi các chuỗi được chèn vào cơ sở dữ liệu. Nhưng nếu phương thức xử lý như vậy không khả thi hoặc không mong muốn, thì người ta phải sử dụng phương pháp cũ tốt là chèn các ký tự dấu gạch chéo ngược và sau đó xóa các ký tự đó.

Hàm addlash () chuyển đổi các ký tự dấu nháy đơn và dấu ngoặc kép, dấu gạch chéo ngược và ký tự rỗng để thoát khỏi chuỗi sử dụng dấu gạch chéo ngược, vì đây là những ký tự thường cần được chuyển đổi để thoát chuỗi khi chuẩn bị truy vấn đối với cơ sở dữ liệu:

$ Escapestring = addlashes ("Chuỗi có" dấu ngoặc kép "."); $ query = "CHÈN VÀO các giá trị kiểm tra (quote) (" $ Escapestring ")"; $ result = mysqli_query ($ link, $ query) hoặc die (mysql_error ());

Việc chạy mã này ngăn câu lệnh SQL bị hiểu sai như thể chuỗi kết thúc ngay trước ký tự "k". Và sau khi tìm nạp dữ liệu này, bạn cần sử dụng hàm dải gạch chéo () để loại bỏ dấu gạch chéo ngược.

Hàm quotemeta () chuyển đổi một bộ ký tự rộng hơn thành chuỗi thoát. Tất cả các ký tự này thường có ý nghĩa đặc biệt trên dòng lệnh Unix: ".", "" "," + "," * ","? "," [","] "," ^ "," ("," $ "và") ". Ví dụ: chạy đoạn mã sau:

$ str = "Các ký tự này ($, *, ^) cần được chuyển đổi."; echo quotemeta ($ str);

xuất ra dòng này:

Xuất các chức năng ra thiết bị bên ngoài và ra đường truyền

Các cấu trúc chính được sử dụng cho đầu ra là print và echo, đã được thảo luận chi tiết trước đó. Cách tiêu chuẩn để xuất giá trị của các biến ra thiết bị bên ngoài là bao gồm tên của các biến này trong một chuỗi được trích dẫn kép (được trình thông dịch xử lý để thay thế giá trị của các biến), rồi chuyển chuỗi này đến cấu trúc print hoặc echo.

Nếu bạn cần đầu ra được định dạng chính xác hơn, bạn có thể sử dụng các hàm printf () và sprintf () của PHP. Hai hàm này nhận các tham số giống nhau: một chuỗi định dạng đặc biệt theo sau là một số lượng tùy ý các tham số khác được thay thế ở những vị trí chính xác trong chuỗi định dạng để tạo ra một kết quả. Sự khác biệt duy nhất giữa printf () và sprintf () là printf () gửi chuỗi kết quả trực tiếp đến thiết bị bên ngoài được sử dụng cho đầu ra, trong khi sprintf () trả về chuỗi kết quả là kết quả của việc thực thi nó.

Một vài lời dành cho các lập trình viên C. Có kinh nghiệm. Phiên bản sprintf () này hơi khác với phiên bản C ở chỗ sprintf () không cần cung cấp một chuỗi được cấp phát để ghi vào, vì trình thông dịch PHP cấp phát bộ nhớ cho chuỗi kết quả thay mặt cho người dùng.

Khó khăn chính liên quan đến việc sử dụng các hàm này là định nghĩa chính xác của chuỗi định dạng. Mỗi ký tự trong chuỗi định dạng xuất hiện trực tiếp trong giá trị kết quả, ngoại trừ các ký tự% và các ký tự ngay sau các ký tự đó. Biểu tượng% đánh dấu sự bắt đầu của một đặc tả chuyển đổi, chỉ định cách xuất ra thiết bị bên ngoài một trong các tham số theo sau chuỗi định dạng.

Sau dấu%, có năm yếu tố tạo nên đặc điểm kỹ thuật chuyển đổi, được mô tả bên dưới, một số yếu tố là tùy chọn: đệm, căn chỉnh, chiều rộng tối thiểu, độ chính xác và loại:

  • Một dấu trừ tùy chọn (-) được sử dụng để cho biết một số có âm hay không.
  • Ký tự điền đơn (tùy chọn) là 0 hoặc dấu cách (). Biểu tượng này được sử dụng để lấp đầy bất kỳ khoảng trống nào nếu không sẽ bị bỏ trống, nhưng người dùng nhất quyết chọn (bằng cách đặt thông số chiều rộng tối thiểu quá cao). Nếu ký tự đệm này không được chỉ định, nó sẽ mặc định là ký tự đệm có dấu cách.
  • Ký tự căn lề tùy chọn (-) chỉ định liệu giá trị đầu ra nên căn trái hay căn phải. Nếu ký tự này được chỉ định, thì giá trị sẽ được căn trái và nếu không có, thì giá trị căn phải được áp dụng.
  • Giá trị số có chiều rộng tối thiểu tùy chọn chỉ định số vị trí tối thiểu mà giá trị đầu ra sẽ chiếm. (Nếu giá trị đầu ra yêu cầu nhiều vị trí ký tự hơn được chỉ định, thì giá trị đầu ra nằm ngoài phạm vi.)
  • Một chỉ định độ chính xác tùy chọn, được định dạng là một dấu chấm (.) Theo sau là một số. Bộ thông số cho biết với độ chính xác nào, được đo bằng số chữ số thập phân sau điểm, một số dấu phẩy động có độ chính xác kép sẽ được xuất ra. (Việc áp dụng đặc điểm kỹ thuật này không ảnh hưởng đến kết quả đầu ra của dữ liệu ngoài số dấu phẩy động có độ chính xác kép.)
  • Một ký tự duy nhất cho biết cách loại giá trị sẽ được diễn giải. Ký tự f cho biết giá trị nên được in dưới dạng số dấu phẩy động có độ chính xác kép, ký tự s cho biết giá trị nên được in dưới dạng chuỗi và các ký tự có thể còn lại (b, c, d, o, x, X ) chỉ ra rằng giá trị phải được hiểu là một số nguyên và xuất ra ở các định dạng khác nhau. Các định dạng này là b cho đầu ra ở định dạng nhị phân, c cho đầu ra của một ký tự có giá trị mã ASCII tương ứng, o cho đầu ra ở định dạng bát phân, x cho đầu ra ở định dạng thập lục phân (với chữ viết thường của các chữ số) và X để hiển thị số thập lục phân sử dụng chữ hoa làm ký hiệu chữ cho chữ số.

Sau đây là một ví dụ về việc xuất ra cùng một số dấu phẩy động có độ chính xác kép theo một số cách khác nhau:

% 10f 
% -10f
% 2.2f ", $ value, $ value, $ value, $ value);?>

Nó tạo ra các kết quả sau:

Cấu trúc được sử dụng trong ví dụ này

...
là một bộ mô tả HTML cho trình duyệt biết rằng khối nằm trong bộ mô tả này phải được định dạng theo nghĩa đen, mà không nén nhiều khoảng trắng thành một, v.v.

Các chức năng để làm việc với mã HTML

PHP cung cấp một số hàm để thao tác với các chuỗi chứa dữ liệu dành riêng cho web. Tổng quan về các tính năng này được cung cấp trong bảng dưới đây:

Các hàm chuỗi được thiết kế để hoạt động với mã HTML

Chức năng Sự miêu tả
htmlspecialchars () Nó nhận một chuỗi làm tham số và trả về một chuỗi trong đó bốn ký tự có ý nghĩa đặc biệt trong ngôn ngữ HTML đã được thay thế bằng các chuỗi đặc biệt. Mỗi ký tự này được thay thế bằng thành phần HTML tương ứng, được thay thế lại bằng ký tự ban đầu khi văn bản trang được mở rộng trong trình duyệt. Ký tự & được thay thế bằng thành phần & ký tự "(ký tự dấu ngoặc kép) - bởi ký tự"< - < а символ > - >
htmlentities () Thực hiện xử lý hoàn chỉnh hơn htmlspecialchars (), tức là thay thế bằng thành phần HTML không chỉ các ký tự đặc biệt, mà còn tất cả các ký tự mà thành phần HTML thay thế được cung cấp
get_html_translation_table () Lấy một trong hai hằng số đặc biệt (HTML_SPECIAL_CHARS hoặc HTML_ENTITIES) và trả về bảng chuyển đổi được sử dụng bởi các hàm htmlspecialchars () hoặc htmlentities () tương ứng. Bảng tra cứu là một mảng có các khóa là các chuỗi ký tự và các giá trị tương ứng là các chuỗi để thay thế chúng.
nl2br () Lấy một chuỗi làm tham số và trả về cùng một chuỗi, nhưng có bộ mô tả
, được chèn trước tất cả các ký tự cuối dòng (\ n, \ r hoặc \ r \ n). Nhu cầu sử dụng chức năng này phát sinh, ví dụ, nếu bạn muốn cung cấp cùng một cách lập trình của văn bản được hiển thị trong trình duyệt như trong văn bản nguồn
strip_tags () Lấy một chuỗi làm tham số và cố gắng hết sức để tạo thành một chuỗi loại bỏ tất cả các bộ mô tả HTML và tất cả các bộ mô tả PHP

Băm dữ liệu bằng thuật toán MD5

Thuật toán MD5 là một thuật toán xử lý chuỗi được sử dụng để tạo ra cái gọi là thông báo hoặc chữ ký số, cho bất kỳ chuỗi nào được truyền dưới dạng tham số. Thuật toán tạo ra một chuỗi có độ dài không đổi dựa trên chuỗi đầu vào, bao gồm 32 chữ số thập lục phân (0-9, a-f). Các kết quả được tạo ra bởi thuật toán MD5 có các thuộc tính rất hữu ích, như được mô tả dưới đây:

  • Thuật toán MD5 luôn đảm bảo rằng chuỗi đầu ra giống nhau khi cho cùng một chuỗi đầu vào, do đó mã hóa MD5 không thể được sử dụng để lưu trữ mật khẩu.
  • Kết quả của việc áp dụng thuật toán MD5 có độ dài cố định và rất đồng đều trên toàn bộ phạm vi giá trị có thể.
  • Một chuỗi đầu vào có thể được tạo ra tương ứng với một chuỗi đầu ra nhất định của thuật toán MD5 hoặc hai chuỗi đầu vào có thể được tạo, quá trình xử lý sẽ dẫn đến cùng một chuỗi đầu ra, nhưng chỉ trong một số điều kiện nhất định.

Việc triển khai thuật toán MD5 của PHP có sẵn dưới dạng hàm md5 (), lấy một chuỗi làm đầu vào và tạo ra kết quả dưới dạng thông báo 32 ký tự. Ví dụ: chạy đoạn mã sau:

$ str = "Xin chào thế giới!"; echo "Mã băm cho chuỗi" $ str ": ".md5 ($ str)."
"; $ str =" Hello, world! "; echo" Mã băm cho chuỗi "$ str": ".md5 ($ str)."
"; $ str =" Hello world "; echo" Mã băm cho chuỗi "$ str": ".md5 ($ str)."
";

dẫn đến các kết quả sau trong cửa sổ trình duyệt:

Tất nhiên, trong trường hợp này, tất cả các chuỗi đầu vào rất giống nhau, nhưng các chuỗi đầu ra không có bất kỳ sự giống nhau rõ ràng nào. Ngoài ra, phạm vi giá trị đầu ra có thể có là cực kỳ lớn (1632), do đó, khả năng hai chuỗi khác nhau được xử lý (sẽ tạo ra cùng một giá trị MD5) là cực kỳ khó xảy ra.

Do các đặc điểm trên của thuật toán MD5, các giá trị thu được với sự trợ giúp của nó có thể được sử dụng để giải quyết nhiều vấn đề, bao gồm cả những vấn đề được mô tả dưới đây:
Tính tổng tổng của một tin nhắn hoặc tệp tin
Để kiểm tra xem tin nhắn có bị hỏng trong quá trình truyền hay không, bạn có thể gửi thông báo MD5 cùng với tin nhắn và tạo lại thông báo MD5 khi nhận được tin nhắn. Nếu hai phiên bản của thông báo không khớp, thì lỗi đã được thực hiện trong quá trình truyền.
Kiểm soát xem nội dung của tệp có thay đổi hay không
Nhiệm vụ này tương tự như nhiệm vụ tính toán tổng kiểm tra. Thuật toán MD5 thường được sử dụng để thực hiện thao tác này trong các công cụ tìm kiếm nếu nó được yêu cầu kiểm tra định kỳ xem một trang web đã thay đổi hay chưa và lập chỉ mục lại nếu cần. Thực tế là để xác minh thêm, việc tổ chức lưu trữ thông báo MD5 dễ dàng hơn nhiều so với toàn bộ tệp nguồn.
Tách nhiều chuỗi hoặc tệp thành các tập hợp con
Để giải quyết vấn đề tách một tập hợp chuỗi thành N tập hợp con được chọn ngẫu nhiên, bạn có thể tính toán thông báo MD5 của mỗi chuỗi, lấy một vài ký tự thập lục phân đầu tiên, chuyển đổi chúng thành một số, lấy modulo modulo của số đó và sử dụng phần còn lại là số tập hợp con, trong đó dòng này sẽ được viết.

Ngoài hàm md5 (), PHP cung cấp hàm md5_file (), lấy tên tệp làm tham số và trả về giá trị MD5 được băm tương ứng với nội dung của tệp.

Các hàm được thiết kế để đánh giá sự giống nhau của các chuỗi

Trong thực tế, thường trở nên cần thiết để xác định xem hai chuỗi tương tự như thế nào. Rõ ràng, kết quả của ước tính độ tương tự của chuỗi phụ thuộc vào ý nghĩa của khái niệm độ tương tự của chuỗi.

Nếu coi sự giống nhau về chính tả là một tiêu chí để đánh giá sự giống nhau thì người ta có thể áp dụng Số liệu Levenshtein. Hàm levenshtein () nhận hai chuỗi làm tham số và trả về số lượng ký tự tối thiểu của các phép toán cộng, xóa và thay thế cần thiết để chuyển đổi một chuỗi này sang chuỗi khác. Hãy xem xét một ví dụ:

echo levenshtein ("Tim", "Time"); // 1 echo levenshtein ("boy", "chefboyardee"); // 9 echo levenshtein ("không bao giờ", "thông minh"); // 2

Nếu sự giống nhau về ngữ âm được coi là một tiêu chí tương tự, thì các hàm soundex () và metaphone () có thể được sử dụng để đánh giá sự tương đồng. Cả hai hàm này đều lấy chuỗi được đề cập làm đầu vào và trả về một chuỗi khóa cho biết loại phát âm của từ đã cho (được coi như một từ tiếng Anh). Nếu hai từ được sử dụng làm nội dung chuỗi đầu vào tương ứng chính xác với cùng một giá trị đầu ra, thì chúng có khả năng được phát âm giống nhau.

Các chức năng phân tích cú pháp và mã hóa

Đôi khi nó trở nên cần thiết đối với một chương trình để ngắt chuỗi thành các thành phần, được hướng dẫn bởi định nghĩa riêng của nó về những gì nên được coi là một thành phần. Quá trình tách một chuỗi dài thành nhiều phần được gọi là mã hóa. Đặc biệt, quy trình như vậy là một phần của quy trình chung để thông dịch hoặc biên dịch bất kỳ chương trình máy tính nào, bao gồm cả chương trình được viết bằng PHP. Ngôn ngữ PHP cung cấp một hàm đặc biệt cho mục đích này - strtok ().

Hàm strtok () nhận hai tham số: một chuỗi để mã hóa và một chuỗi chứa tất cả các dấu phân cách (các ký tự được coi là ranh giới giữa các mã thông báo). Lần đầu tiên nó được gọi, cả hai tham số đều được sử dụng và hàm trả về giá trị chuỗi đại diện cho mã thông báo đầu tiên. Để chọn các mã thông báo tiếp theo, lệnh gọi tương tự được thực hiện, nhưng tham số chuỗi nguồn bị bỏ qua. Hàm ghi nhớ địa chỉ của chuỗi đã cho trong tham số đầu tiên và sử dụng nó làm chuỗi hiện tại. Ngoài ra, chức năng này ghi nhớ nơi xử lý đã được kết thúc trong cuộc gọi trước đó. Hãy xem xét ví dụ sau:

$ token = strtok ("mã nguồn mở HTML-mã nguồn mở Web script phía máy chủ", ""); while ($ token) (echo $ token. "
"; $ token = strtok (" ");)

dẫn đến kết quả sau trong cửa sổ trình duyệt:

Chuỗi ban đầu được tách tại vị trí có mỗi khoảng trắng.

Hàm strtok () xây dựng từng mã thông báo một. Bạn cũng có thể sử dụng hàm boom (), hàm này thực hiện gần giống như vậy, ngoại trừ việc nó lưu trữ tất cả các mã thông báo cùng một lúc trong một mảng. Sau khi nhận được mã thông báo, được đại diện dưới dạng một mảng, bạn có thể thực hiện bất kỳ hoạt động nào với chúng, bao gồm cả sắp xếp.

Hàm boom () nhận hai tham số: một chuỗi ký tự phân cách và một chuỗi được chia thành các mã thông báo. Hàm này trả về một mảng, mỗi phần tử của nó là một chuỗi con giữa các thể hiện của dấu phân cách trong chuỗi được tách. Hãy xem xét ví dụ sau:

$ boomResult = boom ("VÀ", "một VÀ một hai VÀ một ba");

kết quả là một mảng $ boom_result chứa ba phần tử, mỗi phần tử là một chuỗi: "một", "một hai" và "một ba". Trong ví dụ cụ thể này, không có chữ hoa nào xuất hiện trong bất kỳ chuỗi nào có trong mảng vì dấu phân tách AND không có trong kết quả.

Chuỗi phân tách được sử dụng trong hàm boom () hoàn toàn khác với chuỗi phân tách được sử dụng trong hàm strtok (). Dấu phân tách là một chuỗi hoàn chỉnh, vì vậy tất cả các ký tự trong chuỗi đó phải được tìm thấy trong chuỗi nguồn theo thứ tự giống như trong dấu phân cách để dấu phân cách được coi là tìm thấy.

Mặt khác, một chuỗi phân tách trong hàm strtok () chỉ định nhiều ký tự riêng lẻ, mỗi ký tự được coi như một dấu phân cách. Điều này có nghĩa là hàm boom () được lựa chọn nhiều hơn, nhưng dễ bị phá vỡ hơn. Đặc biệt, nếu một chuỗi dài vô tình bỏ sót dù chỉ một khoảng trắng hoặc một ký tự cuối dòng là một phần của dấu phân cách, thì toàn bộ hoạt động của hàm này có thể bị hỏng.

Hàm boom () có một hàm ngược, implode (), nhận hai tham số: một chuỗi kết nối (tương tự như chuỗi phân tách trong boom ()) và một mảng các chuỗi, tương tự như được trả về bởi boom (). Hàm implode () trả về một chuỗi được tạo bằng cách chèn một chuỗi kết nối giữa tất cả các phần tử chuỗi liên tiếp trong một mảng.

Giá trị của kiểu chuỗi là chuỗi văn bản (viết tắt là chuỗi). Chuỗi là một chuỗi không hoặc nhiều ký tự. Các ký hiệu bao gồm chữ cái, số, dấu câu, ký tự đặc biệt và dấu cách.

Một chuỗi có thể được định nghĩa theo bốn cách khác nhau:

  • dấu ngoặc kép
  • dấu nháy đơn
  • cú pháp heredoc
  • cú pháp nowdoc

Chuỗi trong dấu ngoặc kép

Chuỗi trong dấu ngoặc kép:

Chuỗi thoát có thể được sử dụng trên chuỗi được trích dẫn kép. Trình tự thoát là các ký tự đặc biệt để định dạng đầu ra văn bản. Các chuỗi thoát sau có sẵn trong PHP:

Thuộc tính chính của chuỗi được trích dẫn kép là khả năng xử lý các biến trong chuỗi.


Ký hiệu đô la: \ $ ";

Các chuỗi được đặt trong dấu ngoặc kép có thể chứa các ký tự trích dẫn đơn:

Echo "Dấu nháy đơn:" ";

Chuỗi trong dấu ngoặc kép (dấu nháy đơn)

Chuỗi trong dấu ngoặc kép:

$ str = "chuỗi"; echo "Một dòng lớn có thể được chia thành nhiều dòng nhỏ để dễ đọc hơn.";

Không giống như các chuỗi được trích dẫn kép và cú pháp heredoc, các biến và chuỗi thoát (với một ngoại lệ) nằm trong dấu ngoặc kép không được phân tích cú pháp. Điều này có nghĩa là chúng sẽ được hiểu là các ký tự chuỗi bình thường:

$ num = 10; echo "Số: $ num
Ký hiệu đô la: \ $ ";

Để có thể sử dụng các dấu nháy đơn trong một chuỗi được đặt trong dấu nháy đơn, bạn cần phải loại bỏ chúng bằng dấu gạch chéo ngược (\ "). Nếu bạn cần viết chính dấu gạch chéo ngược, bạn cần sao chép nó (\\):

Echo "Nội bộ \" đơn \ "dấu ngoặc kép được sử dụng"; echo "Dấu gạch chéo ngược: \\";

Các chuỗi được đặt trong dấu ngoặc kép có thể chứa các ký tự dấu ngoặc kép:

Echo "Dấu ngoặc kép:" ";

cú pháp heredoc

Cú pháp Heredoc là một cách thay thế để viết chuỗi.

Một chuỗi được xác định bằng cú pháp Heredoc hoạt động giống như một chuỗi được đặt trong dấu ngoặc kép. Sự khác biệt giữa Heredoc và một chuỗi có dấu ngoặc kép là việc sử dụng Heredoc không cần phải thoát khỏi dấu ngoặc kép.

Cú pháp Heredoc bắt đầu bằng ba ký tự<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Đi thẳng sau mã định danh, phải theo sau một dòng mới, không được có bất kỳ ký tự nào khác ngoài dòng mới sau mã định danh, nếu không sẽ xảy ra lỗi. Tiếp theo là nội dung chuỗi thực tế. Sau nội dung chuỗi, trên một dòng riêng biệt, phải có một mã định danh đóng (giống như sau<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

cú pháp nowdoc

Cú pháp Nowdoc, giống như Heredoc, là một cách thay thế để viết chuỗi.

Một chuỗi được xác định bằng cú pháp Nowdoc hoạt động giống như một chuỗi được đặt trong dấu nháy đơn. Sự khác biệt giữa Nowdoc và một chuỗi được trích dẫn đơn là việc sử dụng Nowdoc không cần phải thoát khỏi các dấu ngoặc kép.

Cú pháp Nowdoc tương tự như Heredoc, với sự khác biệt duy nhất là mã định danh mở đầu phải được đặt trong dấu ngoặc kép:

$ num = 10; tiếng vang<<<"some_id" Число: $num some_id;

Xử lý các biến trong chuỗi

Có hai loại cú pháp để xử lý các biến trong chuỗi: giản dịkhó khăn.

Cú pháp đơn giản- đây là khi tên biến được chỉ định trong dòng nguyên trạng.

Khi trình thông dịch gặp một ký hiệu đô la, nó sẽ bắt đầu tuần tự kiểm tra xem tất cả các ký tự tiếp theo có phải là ký tự hợp lệ trong tên biến hay không. Do đó, để tạo thành một tên biến hợp lệ, nó bắt càng nhiều ký tự càng tốt:

$ str = "Thế giới!"; echo "Xin chào $ str";

Cú pháp phức tạp là khi tên biến được đặt trong dấu ngoặc nhọn.

Vì để xử lý một biến trong một chuỗi, trình thông dịch nắm bắt càng nhiều ký tự càng tốt, có những tình huống khi trình thông dịch không thể xác định một cách độc lập vị trí kết thúc của tên biến:

$ sport1 = "sẽ"; $ sport2 = "chân"; echo "Tôi thích $ sport1ball và $ sport2ball";

Trong trường hợp này, kết quả mong muốn sẽ không đạt được, vì trình thông dịch sẽ coi $ sport1 là một phần của tên biến $ sport1bol, không tồn tại.

Để thông báo rõ ràng cho trình thông dịch biết vị trí kết thúc của tên biến, bạn cần đặt tên biến trong dấu ngoặc nhọn:

$ sport1 = "sẽ"; $ sport2 = "chân"; echo "Tôi thích ($ sport1) bol và ($ sport2) bol.";

Dấu đô la có thể được đặt trước hoặc sau dấu ngoặc nhọn:

$ sport1 = "sẽ"; $ sport2 = "chân"; echo "Tôi thích $ (sport1) bol và ($ sport2) bol.";

Sự kết hợp

Nối là việc nối hai hoặc nhiều chuỗi thành một chuỗi lớn. Việc hợp nhất được thực hiện bằng cách sử dụng toán tử nối -. (dấu chấm). Khi nối, mỗi dòng tiếp theo được thêm vào cuối dòng trước:

Giá trị của bất kỳ kiểu nào được nối với một chuỗi sẽ được chuyển đổi hoàn toàn thành một chuỗi và sau đó được nối:

"; echo" Số: ". 1;?>

Nhận xét: Trong PHP 7.0.0 trên nền tảng 64 bit, không có giới hạn độ dài chuỗi có thể đạt được, trên hệ thống 32 bit và các phiên bản PHP trước đó, chuỗi không được lớn hơn 2 GB (2147483647 byte).

Cú pháp

Một chuỗi có thể được định nghĩa theo bốn cách khác nhau:

  • dấu nháy đơn
  • dấu ngoặc kép
  • cú pháp nowdoc (kể từ PHP 5.3.0)

Dấu nháy đơn

Cách đơn giản nhất để xác định một chuỗi là đặt nó trong dấu ngoặc kép (ký hiệu " ).

Để sử dụng một dấu ngoặc kép trong một chuỗi, hãy thoát khỏi nó bằng dấu gạch chéo ngược ( \ ). Nếu bạn cần viết chính dấu gạch chéo ngược, hãy nhân bản nó ( \\ ). Tất cả các dấu gạch chéo ngược khác sẽ được hiểu là các ký tự thông thường, có nghĩa là nếu bạn cố gắng sử dụng các chuỗi thoát khác, chẳng hạn như \ r hoặc là \n, chúng sẽ được xuất như nguyên trạng thay vì bất kỳ hành vi đặc biệt nào.

tiếng vang "đây là một chuỗi đơn giản";

tiếng vang "Ngoài ra, bạn có thể chèn vào các dòng
ký tự dòng mới như thế này,
điều này là bình thường "
;

// Kết quả đầu ra: Một ngày Arnold nói: "Tôi sẽ quay lại"
tiếng vang "Một ngày Arnold nói," Tôi sẽ quay lại "";

tiếng vang "Bạn đã xóa C: \\ *. *?";

// Kết quả đầu ra: Bạn đã xóa C: \ *. *?
echo "Bạn đã xóa C: \ *. *?" ;

// Đầu ra: Điều này sẽ không được mở rộng: \ n dòng mới
tiếng vang "Điều này sẽ không mở rộng: \ n dòng mới";

// Bản in: Các biến $ expand cũng không được mở rộng bởi $
tiếng vang "Các biến $ mở rộng cũng $ không được mở rộng";
?>

Dấu ngoặc kép

Nếu chuỗi được đặt trong dấu ngoặc kép ("), thì PHP sẽ nhận ra các chuỗi ký tự thoát ký tự đặc biệt sau:

Trình tự thoát
Sự nối tiếp Nghĩa
\n dòng mới (LF hoặc 0x0A (10) trong ASCII)
\ r ký tự xuống dòng (CR hoặc 0x0D (13) trong ASCII)
\ t tab ngang (HT hoặc 0x09 (9) trong ASCII)
\ v tab dọc (VT hoặc 0x0B (11) trong ASCII) (kể từ PHP 5.2.5)
\ e ký tự thoát (ESC hoặc 0x1B (27) trong ASCII) (kể từ PHP 5.4.4)
\ f nguồn cấp dữ liệu trang (FF hoặc 0x0C (12) trong ASCII) (kể từ PHP 5.2.5)
\\ dấu gạch chéo ngược
\$ ký hiệu đô la
\" dấu ngoặc kép
\{1,3} chuỗi ký tự khớp với một biểu thức chính quy của một ký tự trong hệ bát phân âm thầm tràn để vừa với một byte (tức là "\ 400" === "\ 000")
\ x (1,2) một chuỗi các ký tự khớp với một biểu thức chính quy ký tự trong hệ thập lục phân
\ u (+) chuỗi ký tự khớp với một biểu thức chính quy ký tự Unicode ánh xạ tới một chuỗi trong biểu diễn UTF-8 (được thêm vào trong PHP 7.0.0)

Giống như với một chuỗi được đặt trong dấu ngoặc kép, việc thoát bất kỳ ký tự nào cũng sẽ in chính ký tự thoát đó. Trước PHP 5.1.1, dấu gạch chéo ngược trong \ ($ var) không được in.

Heredoc

Cách thứ ba để xác định chuỗi là sử dụng cú pháp heredoc: <<< . Sau câu lệnh này, bạn phải chỉ định một số nhận dạng, sau đó là một dòng mới. Sau đó đến dòng chính nó, và sau đó là cùng một mã định danh đóng phần chèn.

Hàng Nên bắt đầu bằng số nhận dạng đóng, tức là nó phải ở cột đầu tiên của hàng. Ngoài ra, mã định danh phải tuân theo các quy tắc đặt tên giống như tất cả các thẻ PHP khác: chỉ chứa các ký tự chữ và số và dấu gạch dưới, và không được bắt đầu bằng một số (cho phép dấu gạch dưới).

Chú ý

Điều rất quan trọng cần lưu ý là chuỗi có mã định danh đóng không được chứa các ký tự khác, ngoại trừ dấu chấm phẩy ( ; ). Điều này có nghĩa là mã định danh không được thụt vào và không được có bất kỳ khoảng trắng hoặc tab nào trước hoặc sau dấu chấm phẩy. Cũng cần hiểu rằng ký tự đầu tiên trước mã định danh đóng phải là một ký tự dòng mới, như được xác định bởi hệ điều hành của bạn. Ví dụ: trên hệ thống UNIX, bao gồm cả macOS, đây là \n. Định danh đóng cũng phải được đặt ngay sau một dòng mới.

Nếu quy tắc này bị vi phạm và số nhận dạng đóng không "sạch", nó được coi là không có số nhận dạng đóng và PHP sẽ tiếp tục tìm kiếm nó. Trong trường hợp này, nếu mã định danh đóng chính xác không bao giờ được tìm thấy, thì điều này sẽ gây ra lỗi phân tích cú pháp với số dòng ở cuối tập lệnh.

Beispiel # 1 Ví dụ về cú pháp không chính xác

lớp foo (
public $ bar =<<quán ba
BẤT TỬ;
// khoảng đệm trước mã định danh đóng không được phép
}
?>

Beispiel # 2 Ví dụ về cú pháp đúng

lớp foo (
public $ bar =<<quán ba
BẤT TỬ;
}
?>

Heredoc không thể được sử dụng để khởi tạo các trường lớp. Kể từ PHP 5.3, hạn chế này chỉ áp dụng cho các heredocs có chứa các biến bên trong chúng.

Văn bản Heredoc hoạt động giống như một chuỗi được trích dẫn kép mà không có chúng. Điều này có nghĩa là bạn không cần phải thoát các dấu ngoặc kép trong heredoc, nhưng bạn vẫn có thể sử dụng các chuỗi thoát ở trên. Các biến được xử lý, nhưng bạn cần phải cẩn thận khi sử dụng các biến phức tạp bên trong một heredoc như khi làm việc với chuỗi.

Ví dụ về định nghĩa chuỗi heredoc của Beispiel # 3

$ str =<<Ví dụ về dòng,
kéo dài nhiều dòng
bằng cách sử dụng cú pháp heredoc.
EOD;

Foo lớp
{
var $ foo;
var $ bar;

Hàm __construct ()
{
$ this -> foo = "foo";
$ cái này ->
}
}

$ foo = newfoo ();
$ name = "Tên";

tiếng vang<<Tên tôi là "$ name". Tôi gõ $ foo -> foo .
Bây giờ tôi đang lấy ra
($ foo -> thanh [1]) .
Điều này sẽ xuất ra chữ hoa "A": \ x41
BẤT TỬ;
?>

Tên tôi là "Tên". Tôi đang gõ Foo. Bây giờ, tôi đang xuất ra Bar2. Điều này sẽ xuất ra một chữ hoa "A": A

Cũng có thể sử dụng cú pháp heredoc để chuyển dữ liệu qua các đối số của hàm:

Kể từ phiên bản 5.3.0, có thể khởi tạo các biến tĩnh và thuộc tính / hằng số của lớp bằng cách sử dụng cú pháp heredoc:

Beispiel # 5 Sử dụng heredoc để khởi tạo các biến tĩnh

// Biến tĩnh
functionfoo ()
{
static $ bar =<<Không có gì ở đây...
nhãn mác;
}

// Hằng số / thuộc tính của lớp
lớp foo
{
const BAR =<<Một ví dụ về việc sử dụng một hằng số
FOOBAR;

Public $ base =<<Ví dụ về sử dụng trường
FOOBAR;
}
?>

Kể từ PHP 5.3.0, cũng có thể đặt mã định danh Heredoc bằng dấu ngoặc kép:

Nowdoc

Nowdoc tương tự đối với các chuỗi được trích dẫn đơn vì heredoc dành cho các chuỗi được trích dẫn kép. Nowdoc tương tự như heredoc, nhưng bên trong nó không có sự thay thế nào được thực hiện. Cấu trúc này lý tưởng để nhúng mã PHP hoặc các khối văn bản lớn khác mà không cần phải thoát khỏi nó. Trong đó, nó hơi giống với cấu trúc SGML. bằng cách khai báo một khối văn bản không dự định được xử lý.

Nowdoc được chỉ ra bởi cùng một chuỗi <<< , được sử dụng trong heredoc, nhưng số nhận dạng theo sau nó được đặt trong dấu ngoặc kép, ví dụ: <<<"EOT" . Tất cả các điều kiện áp dụng cho số nhận dạng heredoc cũng áp dụng cho nowdoc, đặc biệt là những điều kiện áp dụng cho số nhận dạng đóng.

Ví dụ về Beispiel # 7 nowdoc

tiếng vang<<<"EOD"
ví dụ văn bản,
kéo dài nhiều dòng
sử dụng cú pháp nowdoc. Dấu gạch chéo ngược luôn được xử lý theo nghĩa đen,
ví dụ: \\ và \ ".
EOD;

Kết quả của việc chạy ví dụ này:

Một ví dụ về văn bản kéo dài nhiều dòng bằng cú pháp nowdoc. Dấu gạch chéo ngược luôn được xử lý theo nghĩa đen, như \\ và \ ".

Ví dụ # 8 Ví dụ về trích dẫn chuỗi Nowdoc với các biến

/ * Ví dụ phức tạp hơn với các biến. * /
lớp foo
{
công cộng $ foo;
thanh $ công cộng;

Hàm __construct ()
{
$ this -> foo = "foo";
$ this -> bar = array ("Bar1", "Bar2", "Bar3");
}
}

$ foo = newfoo ();
$ name = "Tên";

tiếng vang<<<"EOT"
Tên tôi là "$ name". Tôi đang nhập $ foo-> foo.
Bây giờ tôi đang nhập ($ foo-> bar).
Điều này không được viết hoa "A": \ x41
BẤT TỬ;
?>

Kết quả của việc chạy ví dụ này:

Tên tôi là "$ name". Tôi đang nhập $ foo-> foo. Bây giờ tôi đang nhập ($ foo-> bar). Điều này không được viết hoa "A": \ x41

Ví dụ # 9 Ví dụ về dữ liệu tĩnh

lớp foo (
public $ bar =<<<"EOT"
quán ba
BẤT TỬ;
}
?>

Nhận xét:

Hỗ trợ nowdoc đã được thêm vào trong PHP 5.3.0.

Xử lý các biến

Nếu một chuỗi được chỉ định trong dấu ngoặc kép hoặc bằng heredoc, thì các biến bên trong nó sẽ được xử lý.

Có hai loại cú pháp: đơn giản và phức tạp. Cú pháp đơn giản dễ dàng hơn và thuận tiện hơn. Nó làm cho nó có thể xử lý một biến, một giá trị mảng ( mảng) hoặc thuộc tính đối tượng ( sự vật) với nỗ lực tối thiểu.

Cú pháp phức tạp có thể được xác định bằng dấu ngoặc nhọn bao quanh biểu thức.

Cú pháp đơn giản

Nếu thông dịch viên gặp ký hiệu đô la ( $ ), nó nắm bắt càng nhiều ký tự càng tốt để tạo thành tên biến chính xác. Nếu bạn muốn chỉ định phần cuối của tên, hãy đặt tên biến trong dấu ngoặc nhọn.

$ nước trái cây = "apple";

echo "Anh ấy đã uống một ít nước trái cây $." . PHP_EOL;

// Không đúng. "s" là một ký tự hợp lệ cho một tên biến, nhưng tên biến là $ juice.
echo "Anh ấy đã uống một ít nước trái cây làm từ nước trái cây $." ;

// Chính xác. Phần cuối của tên biến được chỉ định chặt chẽ bằng cách sử dụng dấu ngoặc:
echo "Anh ấy đã uống một ít nước trái cây làm từ $ (nước trái cây) s." ;
?>

Kết quả của việc chạy ví dụ này:

Anh ấy uống một ít nước táo. Anh ấy uống một ít nước trái cây làm bằng. Anh ấy uống một ít nước trái cây làm từ táo.

Một phần tử của một mảng ( mảng) hoặc thuộc tính đối tượng ( sự vật). Trong chỉ số mảng, dấu ngoặc vuông đóng ( ] ) đánh dấu phần cuối của định nghĩa chỉ mục. Các quy tắc tương tự cũng áp dụng cho các thuộc tính đối tượng cũng như cho các biến đơn giản.

Ví dụ # 10 Ví dụ về cú pháp đơn giản

xác định ("KOOLAID", "koolaid1");
$ juices = array ("táo", "cam", "koolaid1" => "tím");

echo "Anh ấy đã uống một ít nước trái cây $ juices [0]." . PHP_EOL;
echo "Anh ấy đã uống một ít nước trái cây $ juices [1]." . PHP_EOL;
echo "Anh ấy đã uống một ít nước trái cây $ juices [koolaid1]." . PHP_EOL;

lớp người (
public $ john = "John Smith";
public $ jane = "Jane Smith";
public $ robert = "Robert Paulsen";

Công cộng $ smith = "Smith";
}

$ people = người mới ();

echo "$ people -> john đã uống một ít nước trái cây $ juices [0]." . PHP_EOL;
echo "$ people -> john sau đó chào $ people -> jane." . PHP_EOL;
echo "$ people -> john" s vợ chào $ people -> robert. ". PHP_EOL;
echo "$ people -> robert chào hai $ people -> smiths." ; // Sẽ không hoạt động
?>

Kết quả của việc chạy ví dụ này:

Anh ấy uống một ít nước táo. Anh ấy uống một ít nước cam. Anh uống một ít nước màu tím. John Smith uống một ít nước táo. John Smith sau đó nói lời chào với Jane Smith. Vợ của John Smith chào Robert Paulsen Robert Paulsen chào hai người.

Hỗ trợ thêm PHP 7.1.0 phủ định các chỉ mục số.

Ví dụ # 11 Chỉ số số phủ định

$ string = "string";
tiếng vang "Ký tự ở chỉ số -2 là$ string [- 2]. ", PHP_EOL;
$ string [- 3] = "o";
tiếng vang "Thay đổi ký tự ở vị trí -3 thành 'o' sẽ tạo ra dòng sau:$ string. ", PHP_EOL;
?>

Kết quả của việc chạy ví dụ này:

Kí tự có chỉ số -2 là n. Thay đổi ký tự ở vị trí -3 thành "o" sẽ tạo ra chuỗi sau: strong

Đối với bất kỳ điều gì phức tạp hơn, hãy sử dụng cú pháp phức tạp.

Cú pháp phức tạp (xoăn)

Nó được gọi là phức tạp không phải vì nó khó hiểu, mà vì nó cho phép sử dụng các biểu thức phức tạp.

Mọi biến vô hướng, phần tử mảng hoặc thuộc tính đối tượng được ánh xạ tới một chuỗi đều có thể được biểu diễn trong một chuỗi với cú pháp này. Chỉ cần viết biểu thức giống như bạn làm bên ngoài chuỗi và sau đó đặt nó vào { } . Trong chừng mực { không thể thoát được, cú pháp này sẽ chỉ được nhận dạng khi $ theo dõi trực tiếp sau { . Sử dụng {\$ để in {$ . Một vài ví dụ minh họa:

// Hiển thị tất cả các lỗi
error_reporting (E_ALL);

$ tuyệt vời = "tuyệt vời";

// Không hoạt động, kết quả: This (tuyệt vời)
echo "Đây là ($ tuyệt vời)";

// Hoạt động, kết quả đầu ra: Điều này thật tuyệt vời
echo "Đây là ($ tuyệt vời)";

// Đang làm việc
tiếng vang "Hình vuông này rộng($ vuông -> chiều rộng) 00 cm. ";

// Hoạt động, các khóa được trích dẫn chỉ hoạt động với cú pháp dấu ngoặc nhọn
echo "Cái này hoạt động: ($ arr [" key "])";

// Đang làm việc
echo "Cái này hoạt động: ($ arr [4] [3])";

// Điều này sai vì cùng một lý do mà $ foo nằm ngoài
// dòng. Nói cách khác, nó sẽ vẫn hoạt động
// nhưng vì PHP tìm kiếm hằng số foo trước, điều này sẽ gọi
// Lỗi mức E_NOTICE (hằng số không xác định).
tiếng vang "Nó không đúng:($ arr [foo] [3]) ";

// Đang làm việc. Khi sử dụng mảng nhiều chiều bên trong
// chuỗi luôn sử dụng dấu ngoặc nhọn
echo "Cái này hoạt động: ($ arr [" foo "] [3])";

// Đang làm việc.
echo "Điều này hoạt động:". $ arr ["foo"] [3];

tiếng vang "Điều này cũng hoạt động:($ obj -> giá trị [3] -> tên) ";

tiếng vang "Đây là giá trị của biến có tên$ name: ($ ($ name)) ";

tiếng vang "Đây là giá trị của biến theo tên, được trả về bởi hàm getName ():($ (getName ())) ";

tiếng vang "Đây là giá trị của biến theo tên được trả về bởi \ $ object-> getName ():($ ($ object -> getName ())) ";

// Không hoạt động, kết quả đầu ra: Đây là những gì getName () trả về: (getName ())
tiếng vang "Đây là những gì getName () trả về: (getName ())";
?>

Cũng có thể truy cập thuộc tính đối tượng trong chuỗi bằng cú pháp này.

lớp foo (
var $ bar = "Tôi là quán bar." ;
}

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

Kết quả của việc chạy ví dụ này:

Tôi thanh. Tôi thanh.

Nhận xét:

Các hàm, lời gọi phương thức, biến lớp tĩnh và hằng số lớp hoạt động nội bộ {$} , kể từ phiên bản PHP 5. Tuy nhiên, giá trị được chỉ định sẽ được coi là một tên biến trong cùng ngữ cảnh với chuỗi mà nó được định nghĩa. Sử dụng dấu ngoặc nhọn đơn ( {} ) sẽ không hoạt động để truy cập các giá trị của hàm, phương thức, hằng số lớp hoặc biến lớp tĩnh.

// Hiển thị tất cả các lỗi
error_reporting (E_ALL);

loại bia (
const softdrink = "rootbeer";
public static $ ale = "ipa";
}

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

// Điều này hoạt động, kết quả đầu ra: Tôi muốn A & W
echo "Tôi muốn ($ (bia :: softdrink)) \ n";

// Điều này cũng hoạt động, kết quả đầu ra: Tôi muốn Alexander Keith "s
echo "Tôi muốn ($ (bia :: $ ale)) \ n";
?>

Truy cập một ký tự trong một chuỗi và thay đổi nó

Các ký tự trong chuỗi có thể được sử dụng và sửa đổi bằng cách chỉ định phần bù của chúng từ đầu chuỗi, bắt đầu từ 0, trong dấu ngoặc vuông sau chuỗi, ví dụ: $ str. Hãy nghĩ về một chuỗi cho mục đích này như một mảng các ký tự. Nếu bạn cần lấy hoặc thay thế nhiều hơn 1 ký tự, bạn có thể sử dụng các hàm substr ()substr_replace ().

Nhận xét: kể từ PHP 7.1.0, các giá trị bù trừ âm được hỗ trợ. Họ đặt độ lệch từ cuối chuỗi. Trước đây, hiệu số âm gây ra lỗi cấp E_NOTICE khi đọc (trả về một chuỗi trống) hoặc E_WARNING khi ghi (giữ nguyên chuỗi).

Nhận xét: Một ký tự trong chuỗi cũng có thể được truy cập bằng cách sử dụng dấu ngoặc nhọn, chẳng hạn như $ str (42).

Chú ý

Việc cố gắng ghi vào một khoảng cách bên ngoài chuỗi sẽ chèn vào chuỗi những khoảng trắng lên đến phần bù đó. Các kiểu không phải số nguyên sẽ được chuyển đổi thành số nguyên. Loại bù sai sẽ gây ra lỗi mức E_WARNING. Chỉ ký tự đầu tiên của chuỗi được gán mới được sử dụng. Kể từ PHP 7.1.0, việc gán một chuỗi trống sẽ gây ra lỗi nghiêm trọng. Trước đây, trong trường hợp này, một byte rỗng (NULL) đã được gán.

Chú ý

Các chuỗi trong PHP là các mảng byte bên trong. Do đó, việc truy cập hoặc sửa đổi một chuỗi bằng offset không an toàn cho nhiều byte và chỉ nên được thực hiện với các chuỗi ở dạng mã hóa byte đơn như ISO-8859-1.

Nhận xét: Kể từ PHP 7.1.0, việc sử dụng một chỉ mục trống gây ra lỗi nghiêm trọng, trước đây trong trường hợp đó, chuỗi đã được chuyển đổi thành một mảng mà không có cảnh báo.

Ví dụ # 12 Một số chuỗi ví dụ

// Lấy ký tự đầu tiên của chuỗi
$ str = "Đây là một bài kiểm tra." ;
$ đầu tiên = $ str [0];

// Lấy ký tự thứ ba của chuỗi
$ thứ ba = $ str [2];

// Lấy ký tự cuối cùng của chuỗi
$ str = "Đây vẫn là một bài kiểm tra." ;
$ last = $ str [strlen ($ str) - 1];

// Thay đổi ký tự cuối cùng của chuỗi
$ str = "Nhìn ra biển";
$ str [strlen ($ str) - 1] = "e";

?>

Kể từ PHP 5.4, phần bù trong một chuỗi phải là một số nguyên hoặc một chuỗi có chứa số, nếu không, một cảnh báo sẽ được đưa ra. Trước đây, một phần bù được cung cấp bởi một chuỗi như "foo", không có cảnh báo đã được chuyển đổi thành 0 .

Ví dụ # 13 Sự khác biệt giữa PHP 5.3 và 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"]));
?>

Kết quả của việc chạy ví dụ này trong PHP 5.3 là:

string (1) "b" bool (true) string (1) "b" bool (true) string (1) "a" bool (true) string (1) "b" bool (true)

Kết quả của việc chạy ví dụ này trong PHP 5.4 là:

string (1) "b" bool (true) Cảnh báo: Khoảng cách chuỗi bất hợp pháp "1.0" trong /tmp/t.php trên dòng 7 string (1) "b" bool (false) Cảnh báo: Khoảng cách chuỗi bất hợp pháp "x" trong / tmp / t.php trên dòng 9 string (1) "a" bool (false) string (1) "b" bool (false)

Nhận xét:

Cố gắng truy cập các biến thuộc các kiểu khác (không bao gồm mảng hoặc đối tượng triển khai các giao diện nhất định) với hoặc là {} âm thầm trở lại VÔ GIÁ TRỊ.

Nhận xét:

PHP 5.5 đã thêm hỗ trợ để truy cập các ký tự trong chuỗi ký tự bằng cách sử dụng cú pháp hoặc là {} .

Có rất nhiều chức năng hữu ích để sửa đổi chuỗi.

Các hàm chính được mô tả trong phần hàm chuỗi và để tìm kiếm nâng cao và thay thế, các hàm biểu thức chính quy tương thích với Perl.

Chuyển đổi thành chuỗi

Giá trị có thể được chuyển đổi thành một chuỗi bằng cách sử dụng ép kiểu (chuỗi), hoặc các chức năng strval (). Trong các biểu thức cần một chuỗi, quá trình chuyển đổi sẽ tự động xảy ra. Điều này xảy ra khi bạn sử dụng các hàm tiếng vang hoặc là in hoặc khi giá trị của một biến được so sánh với một chuỗi. Đọc phần Các kiểu và Thao tác Kiểu của sách hướng dẫn sẽ làm rõ hơn những điều sau đây. Xem thêm settype ().

Mảng luôn được chuyển đổi thành chuỗi "mảng", vì vậy bạn không thể hiển thị nội dung của mảng ( mảng) sử dụng tiếng vang hoặc là inđể xem nó chứa những gì. Để xem một phần tử riêng lẻ, hãy sử dụng một cái gì đó như echo $ arr ["foo"]. Xem bên dưới để biết các mẹo về cách hiển thị / xem tất cả nội dung.

Để chuyển đổi một biến kiểu "Sự vật" mỗi loại chuỗi phương thức ma thuật __toString được sử dụng.

Nghĩa VÔ GIÁ TRỊ luôn được chuyển đổi thành chuỗi trống.

Như bạn có thể thấy ở trên, việc xâu chuỗi trực tiếp mảng, đối tượng hoặc tài nguyên không cung cấp bất kỳ thông tin hữu ích nào về bản thân các giá trị, ngoài các kiểu của chúng. Một cách thích hợp hơn để xuất ra các giá trị để gỡ lỗi là sử dụng các hàm print_r ()var_dump ().

Hầu hết các giá trị trong PHP có thể được chuyển đổi thành một chuỗi để lưu trữ vĩnh viễn. Phương pháp này được gọi là tuần tự hóa và có thể được thực hiện với hàm serialize ().

Chuyển đổi chuỗi thành số

Nếu chuỗi được nhận dạng là một giá trị số, giá trị và kiểu kết quả được xác định như sau.

Nếu chuỗi không chứa bất kỳ ký tự nào trong số các ký tự ".", "E" hoặc "E" và giá trị của số nằm trong phạm vi số nguyên (được xác định PHP_INT_MAX), chuỗi sẽ được nhận dạng là một số nguyên ( số nguyên). Trong tất cả các trường hợp khác, nó được coi là một số dấu phẩy động ( trôi nổi).

Giá trị được xác định bởi phần ban đầu của chuỗi. Nếu chuỗi bắt đầu bằng một giá trị số hợp lệ, giá trị đó sẽ được sử dụng. Nếu không, giá trị sẽ là 0 (không). Giá trị số hợp lệ là một hoặc nhiều chữ số (có thể chứa dấu thập phân), có thể bắt đầu bằng dấu, theo sau là số mũ tùy chọn. Số mũ là "e" hoặc "E" theo sau bởi một hoặc nhiều chữ số.

$ foo = 1 + "10,5"; // $ foo là một float (11.5)
$ foo = 1 + "-1,33"; // $ foo là một float (-1299)
$ foo = 1 + "bob-1.3e3"; // $ foo là một số nguyên (1)
$ foo = 1 + "bob3"; // $ foo là một số nguyên (1)
$ foo = 1 + "10 Con Heo Nhỏ"; // $ foo là một số nguyên (11)
$ foo = 4 + "10,2 Little Piggies"; // $ foo là một float (14.2)
$ foo = "10.0 con lợn" + 1; // $ foo là một float (11)
$ foo = "10.0 con lợn" + 1.0; // $ foo là một float (11)
?>

Xem phần strtod (3) của tài liệu Unix để biết thêm thông tin về chuyển đổi này.

Nếu bạn muốn kiểm tra bất kỳ ví dụ nào trong phần này, hãy sao chép và dán nó và dòng sau để xem điều gì sẽ xảy ra:

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

Đừng mong đợi để lấy mã ký tự bằng cách chuyển đổi nó thành một số nguyên (như đã làm, chẳng hạn như trong C). Để chuyển đổi các ký tự sang mã ASCII của chúng và ngược lại, hãy sử dụng các hàm ord ()chr ().

Chi tiết triển khai loại chuỗi

7 năm trước

Tài liệu không đề cập đến, nhưng dấu chấm phẩy đóng ở cuối heredoc thực sự được hiểu là dấu chấm phẩy thực và như vậy, đôi khi dẫn đến lỗi cú pháp.

$ foo =<<A B C D
CHẤM DỨT;
?>

Điều này không:

foo (<<A B C D
CHẤM DỨT;
);
// lỗi cú pháp, không mong đợi ";"
?>

Không có dấu chấm phẩy, nó hoạt động tốt:

foo (<<A B C D
CHẤM DỨT
);
?>

3 năm trước

Bạn có thể sử dụng chuỗi như mảng ký tự (như C)

$ a = "Kiểm tra mảng chuỗi";

var_dump ($ a);
// Trả về chuỗi (17) "Kiểm tra mảng chuỗi"

var_dump ($ a);
// Trả về chuỗi (1) "S"

// - Với kiểu ép kiểu mảng -
var_dump ((mảng) $ a);
// Trả về mảng (1) (=> string (17) "Kiểm tra mảng chuỗi")

var_dump ((mảng) $ a);
// Trả về chuỗi (17) "S"

Norihiori

15 năm trước

Bạn có thể sử dụng cú pháp phức tạp để đặt giá trị của cả hai thuộc tính đối tượng VÀ các phương thức đối tượng bên trong một chuỗi. Ví dụ...
Kiểm tra lớp (
public $ một = 1;
hàm công cộng hai () (
trả về 2;
}
}
$ test = new Test ();
echo "foo ($ test -> one) bar ($ test -> two ())";
?>
Sẽ xuất ra "foo 1 bar 2".

Tuy nhiên, bạn không thể làm điều này cho tất cả các giá trị trong không gian tên của mình. Hằng số lớp và thuộc tính / phương thức tĩnh sẽ không hoạt động vì cú pháp phức tạp tìm kiếm "$".
Kiểm tra lớp (
const ONE = 1;
}
echo "foo (Test :: ONE) bar";
?>
Điều này sẽ xuất ra "foo (Test :: one) bar". Hằng số và thuộc tính tĩnh yêu cầu bạn chia nhỏ chuỗi.

3 năm trước

Hãy coi chừng điều đó nhất quán với "Chuyển đổi chuỗi thành số":

If ("123abc" == 123) echo "(intstr == int) kiểm tra không chính xác là true.";

// Bởi vì một bên là số, chuỗi được chuyển đổi không chính xác từ intstr thành int, sau đó khớp với số kiểm tra.

// Đúng cho tất cả các điều kiện như câu lệnh if và switch (có thể là cả vòng lặp while)!

// Đây có thể là một rủi ro bảo mật lớn khi kiểm tra / sử dụng / lưu thông tin nhập của người dùng, trong khi chỉ mong đợi và kiểm tra một số nguyên.

// Có vẻ như cách khắc phục duy nhất là cho 123 là một chuỗi là "123" để không có chuyển đổi nào xảy ra.

?>

6 năm trước

Các số 0 đứng đầu trong chuỗi không được coi là số bát phân.
Coi như:
$ x = "0123" + 0;
$ y = 0123 + 0;
echo "x là $ x, y là $ y"; // in ra "x là 123, y là 83"
nói cách khác:
* các số không đứng đầu trong các ký tự số trong mã nguồn được hiểu là "bát phân", c.f. strtol ().
* các số không đứng đầu trong chuỗi (ví dụ: dữ liệu do người dùng gửi), khi ép kiểu (ẩn hoặc rõ ràng) thành số nguyên bị bỏ qua và được coi là số thập phân, c.f. strtod ().

10 năm trước

Đây là một thủ thuật dễ dàng để cho phép các chuỗi được trích dẫn kép và heredocs chứa các biểu thức tùy ý trong cú pháp dấu ngoặc nhọn, bao gồm các hằng số và các lệnh gọi hàm khác:

// Khai báo hack
function_expr ($ v) (return $ v;)
$ _expr = "_expr";

// Sân chơi của chúng tôi
xác định ("qwe" , "asd");
định nghĩa("zxc", 5 );

$ a= 3 ;
$ b= 4 ;

chức năng C($ a, $ b) (trở lại$ a+ $ b; }

// Cách sử dụng
tiếng vang"trước{ $ _expr(1 + 2 )} đăng \ n "; // xuất ra "pre 3 post"
tiếng vang"trước{ $ _expr(qwe)} đăng \ n "; // xuất ra "pre asd post"
tiếng vang"trước{ $ _expr(C($ a, $ b)+ zxc* 2 )} đăng \ n "; // kết quả "pre 17 post"

// Cú pháp chung là ($ _expr (...))
?>

2 năm trước

Tôi cho rằng sẽ rất hữu ích nếu thêm nhận xét này để thông tin ít nhất xuất hiện trên trang bên phải trên trang web PHP.

Lưu ý rằng nếu bạn định sử dụng một chuỗi được trích dẫn kép với khóa liên kết, bạn có thể gặp phải lỗi T_ENCAPSED_AND_WHITESPACE. Một số coi đây là một trong những thông báo lỗi ít rõ ràng hơn.

Một biểu thức chẳng hạn như:

$ trái cây= mảng (
"Một"=> "quả táo",
"b"=> trái chuối,
//Vân vân
);

in "Đây là một$ trái cây[ "Một"]"; // T_ENCAPSED_AND_WHITESPACE
?>

chắc chắn sẽ rơi ra từng mảnh.

Bạn có thể giải quyết nó như sau:

in"Đây là một$ trái cây[ Một] " ; // giải mã khóa
in"Đây là một${ trái cây[ "Một"]} " ; // Cú pháp phức tạp
in"Đây là một{ $ trái cây[ "Một"]} " ; // Biến thể cú pháp phức tạp
?>

Tôi có sở thích cá nhân đối với biến thể cuối cùng vì nó tự nhiên hơn và gần với biểu thức bên ngoài chuỗi.

Không rõ (với tôi, ít nhất là) tại sao PHP lại hiểu sai câu trích dẫn đơn bên trong biểu thức nhưng tôi tưởng tượng rằng nó có liên quan gì đó với thực tế các dấu ngoặc kép không phải là một phần của chuỗi giá trị - một khi chuỗi đã được phân tích cú pháp các dấu ngoặc kép. cản đường…?

2 năm trước

Cả hai đều nên hoạt động :(

lớp họcthử nghiệm{
công cộng tĩnh
$ var= "tĩnh";
const công cộng VAR =
"hăng sô";

chức năng công cộng sayHelloStatic() {
tiếng vang
xin chào:{ $ cái này:: $ var} " ;
}

chức năng công cộng sayHelloConst() {
tiếng vang
xin chào:{ $ cái này:: VAR)" ; // Lỗi phân tích cú pháp: lỗi cú pháp, không mong đợi ")", mong đợi "["
}
}

$ obj= mớithử nghiệm();
$ obj-> sayHelloStatic();
$ obj-> sayHelloConst();

3 năm trước

Một điều gì đó mà tôi đã trải qua chắc chắn sẽ giúp ích cho ai đó. . .
Trong trình soạn thảo của tôi, cú pháp này sẽ tô sáng HTML và $ comment:

$ html =<<<"EOD"
$ comment
EOD;

Sử dụng điều này sẽ hiển thị tất cả các màu giống nhau:

$ html =<<$ comment
EOD;

làm cho nó dễ dàng hơn nhiều để làm việc với

11 năm trước

Để lưu tâm trí của bạn, đừng đọc các bình luận trước đây về ngày tháng;)

Khi cả hai chuỗi có thể được chuyển đổi thành các số (trong ("$ a"> "$ b")) thì các số kết quả được sử dụng, các chuỗi khác ĐẦY ĐỦ được so sánh với char-by-char:

var_dump("1.22" > "01.23" ); // bool (false)
var_dump("1.22.00" > "01.23.00" ); // bool (true)
var_dump("1-22-00" > "01-23-00" ); // bool (true)
var_dump((trôi nổi)"1.22.00" > (float)"01.23.00" ); // bool (false)
?>

Gần đây, các cuộc thảo luận về ngôn ngữ PHP trên Habré đã giảm nhiều hơn đến khả năng thiết kế các hệ thống phức tạp, điều này không thể không làm vui mừng. Tuy nhiên, sau khi xem xét hàng tá các khung công tác web được công nhận nhất (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ và những nền tảng khác), tôi thực sự ngạc nhiên khi phát hiện ra một số thiếu sót đáng kể về mặt tối ưu hóa cơ bản.

Để đề tài này thiên về kỹ thuật, kết quả được trình bày dưới dạng chặt chẽ hơn, có thể làm phức tạp thêm phần nào nhận thức.

Vì vậy, chúng ta hãy ... Nhiệm vụ vô cùng đơn giản: tiến hành thí nghiệm về tốc độ hình thành chuỗi từ các chuỗi con trong dấu ngoặc kép và đơn. Về nguyên tắc, câu hỏi này sẽ có liên quan trong một thời gian dài do đặc thù của xử lý chuỗi trong PHP.

Có rất nhiều bài viết về tối ưu hóa kịch bản cơ bản bằng cả tiếng Nga và các ngôn ngữ khác. Người ta ít nói về chuỗi, nhưng thực tế là "phân tích cú pháp" chuỗi trong dấu ngoặc kép cho các biến và ký tự điều khiển được lưu ý (tuy nhiên, như trong tài liệu chính thức). Dựa trên điều này, hợp lý khi giả định rằng việc sử dụng các chuỗi được trích dẫn kép tại nơi làm việc sẽ chậm hơn một chút so với các hoạt động tương tự với các chuỗi con được trích dẫn đơn.

Ngoài việc thay thế các biến thành chuỗi và nối các biến với chuỗi con, PHP triển khai thêm ít nhất một cách nữa để tạo chuỗi: sử dụng hàm sprintf. Thật hợp lý khi giả định rằng phương thức này sẽ kém hơn đáng kể so với phương thức "tiêu chuẩn" do có thêm lệnh gọi hàm và phân tích cú pháp chuỗi bên trong.

Sự bổ sung duy nhất, trước khi tôi trình bày cho bạn mã tập lệnh thử nghiệm: có 2 tùy chọn khả thi để làm việc với các chuỗi được trích dẫn kép: có tính đến kiểu mã hóa đơn giản và "nâng cao". Thực tế là các biến ở đầu dòng có lẽ không đáng chú ý - chúng chỉ là ví dụ:
$ string = "$ _SERVER [" HTTP_HOST "] không phải là cơ quan quản lý của khu vực Ulyanovsk. Chúng tôi yêu tiếng Nga và không thích những người nói tiếng Nga ..."

$ string = "($ _SERVER [" HTTP_HOST "]) không phải là cơ quan quản lý của khu vực Ulyanovsk. Chúng tôi yêu tiếng Nga và không thích những người nói tiếng này ..."

Bài kiểm tra số một.
Chà, có vẻ như mọi việc đặt trước đã được thực hiện - đã đến lúc thể hiện kết quả công việc. Bạn có thể tìm thấy mã nguồn của người thử nghiệm tại.

Các ảnh chụp màn hình cho thấy giả thuyết của tôi không được xác nhận. Giả định về cách làm việc với các chuỗi thông qua sprintf hóa ra là giả thiết duy nhất đúng. Nhanh nhất là các hàm hoạt động với dấu ngoặc kép.

Sau một thời gian ngắn suy ngẫm về tình huống, lời giải thích tự nó xuất hiện: toàn bộ điểm là chuỗi tham chiếu mà các thay thế được thực hiện quá ngắn: việc phân tích cú pháp đi qua chuỗi như vậy là một vấn đề vặt vãnh. Tuy nhiên, ngay cả ở đây, rõ ràng rằng việc thay thế nguyên bản của một biến thành một chuỗi mang lại lợi thế hơn so với "kiểu nâng cao".
Đây cũng là điểm yếu của phương pháp ghép nối: khối lượng dữ liệu được chèn vào vượt quá khối lượng các chuỗi con. Chi phí đầu tiên đến từ đâu có thể được đọc trong habratopic đã được đề cập.

Tuy nhiên, ngay cả những suy nghĩ này cũng cần được xác nhận. Đối với điều này, một thử nghiệm thứ hai là cần thiết với những thay đổi đối với các lý do có thể được đề cập cho hành vi không thể đoán trước như vậy (đối với tôi). Rõ ràng, rất nhiều thứ đã được tinh chỉnh trong phiên bản thứ năm (thú thực là trong phiên bản thứ năm của php tôi chỉ tiến hành 1 bài kiểm tra: bỏ qua các phần tử mảng).

Bài kiểm tra số hai.
Giả thuyết thứ hai là việc kéo dài chuỗi tham chiếu cuối cùng sẽ làm tăng tỷ lệ phần trăm chức năng của người thử nghiệm liên quan đến việc hình thành chuỗi trong dấu ngoặc kép, liên quan đến kết quả của thử nghiệm số 1. Về mặt lý thuyết, cũng nên quan sát tình huống tương tự đối với hoạt động của hàm sprintf. Điều này trước hết là do nhu cầu phân tích cú pháp chuỗi và sự gia tăng thời gian dành cho nó. Trong trường hợp nối các chuỗi con trong dấu ngoặc kép, tôi nghĩ rằng kết quả sẽ gần giống như trong thử nghiệm đầu tiên, điều này sẽ làm giảm một chút tỷ lệ thời gian thực hiện của hàm dấu ngoặc kép_3 () theo thời gian của toàn bộ tập lệnh (nhưng không tăng hiệu suất).

Trên thực tế, các kết luận chỉ mang tính khẳng định và xác nhận giả thuyết. Khi chuỗi tham chiếu được tăng lên một chút, có một tải lớn, dẫn đến việc giảm hiệu suất của các dấu ngoặc kép và các hàm sprintf.

Giả định về các chuỗi trong dấu nháy đơn cũng trở nên đúng: thay vì 36,75% thời gian trong lần kiểm tra đầu tiên, trong lần thứ hai, hàm ngoặc kép_3 () chiếm 33,76% thời gian thực thi tập lệnh

giá trị thực tiễn.
Nói một cách đơn giản, trừu tượng hóa dữ liệu, chúng ta có thể kết luận rằng chuỗi càng dài mà nó cần thực hiện thay thế thì càng có nhiều khả năng hoàn thành thao tác nối nhanh hơn so với việc tìm kiếm một biến trong dấu ngoặc kép. Tình nguyện viên có thể cố gắng chọn các tham số chèn cần thiết (số lượng biến, độ dài của chuỗi tham chiếu, độ dài của chuỗi trong các biến) sao cho chúng thỏa mãn sự bình đẳng về thời gian thực hiện.

Đó, trên thực tế, là tất cả. Nó vẫn chỉ để nói thêm rằng không có những thứ lặt vặt trong lập trình (điều này dành cho những người thích nói “tiết kiệm khi mua các trận đấu” (c) Adelf). Biết những điều tinh tế như vậy và tính đến chúng, bạn có thể viết mã sẽ được tối ưu hóa ở tất cả các cấp của nó;)

Tái bút:
Các thử nghiệm được thực hiện bằng Zend Studio For Eclipse 6.0.0 (Bao gồm trình gỡ lỗi + Trình biên tập).
Phiên bản PHP 5.2.5
Hệ điều hành Debian Linux

PPS:
Tôi sẽ rất vui nếu ai đó sẽ đăng kết quả của họ về những bài kiểm tra này. Tôi nghĩ rằng điều này sẽ cho phép đánh giá khách quan hơn về nhu cầu sử dụng một hoặc một phương pháp thay thế thành chuỗi. Tôi cũng sẽ biết ơn những lời chỉ trích lành mạnh về phong cách trình bày và thiết kế.