Giống như các ngôn ngữ script khác, chuỗi là loại dữ liệu thông dụng nhất trong PHP, và vì vậy PHP cũng có rất nhiều function xử lý chuỗi rất tốt. Chuỗi trong php là một tập hợp các ký tự, mỗi ký tự là một byte. Một hằng chuỗi trong php được gán trực tiếp cho một biến bằng các cách sau:
- Sử dụng cặp dấu nháy kép: $varstring = "abcd"; - Sử dụng cặp dấu nháy đơn: $varstring = 'abcd'; - Sử dụng cú pháp heredoc:
<?php
$str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD;
?>
11.2 Nối Chuỗi Và Các Ký Tự Đặc Biệt Trong Chuỗi
- Phép toán nối chuỗi: dấu chấm (.): Nối nhiều chuỗi thành chuỗi lớn hơn. Ví dụ:
$s1 = “abc”;
$s2 = “ed” . $s1 .”123”; Print $s2;
- Các ký tự đặc biệt trong chuỗi:
Với một chuỗi hằng được bao trong cặp dấu nháy kép (double-quotes (")), php cung cấp ký tự \ để xử lý các ký tự đặc biệt. Cụ thể như sau:
\n Ký tự xuống dòng \r Trở về đầu dòng \t Ký tự tab \\ backslash \$ dollar sign \" double-quote
Với chuỗi được tạo bằng cặp dấu nháy kép, ta còn có thể sử dụng nội suy biến trong chuỗi, rất thuận lợi trong các truy vấn sql mà không cần mở đóng chuỗi nhiều.
Ví dụ: <?
$s1 ="He said: \"It's a book\""; print $s1;
$s2 = "<a href=\"test.php\"> Test </a>\n<br> "; print $s2;
$s3 = "Gia tri \$s1=$s1 và \$s2=$s2"; print $s3;
?>
11.3 So Sánh Chuỗi
Có thể dùng toán tử so sánh = = (bằng), !=, <, <=, >, >=, ===để so sánh các chuỗi. Ngoài ra, ta còn có một số phương thức so sánh chuỗi như sau:
- Các hàm strcmp(), strcasecmp(), strnatcmp() sẽ so sánh các chuỗi theo phép so sánh tự điển.
- Hàm int strcmp(string S1, string S2): So sánh 2 chuỗi S1, S2 có phân biệt hoa/thường. Hàm này trả về giá trị >0 nếu S1>S2, 0 nếu S1=S2 và giá trị <0 nếu S1<S2. Nói chung hàm này có thể sử dụng giống toán tử so sánh trong biểu thức. - Hàm int strcasecmp(string S1, string S2): Giống hàm strcmp() nhưng không phân
biệt chữ hoa và chữ thường.
Ví dụ
<?
$var1 = "Hello"; $var2 = "hello";
echo “Length $var1:” . strlen($var1); if (!strcasecmp ($var1, $var2))
echo “$var1 = $var2 in a case-insensitive “ if (strcmp($var1, $var2) >0)
echo “$var1 > $var2”; if (strcmp($var1, $var2) <0)
echo “$var1 < $var2”; if (strcmp($var1, $var2) ==0) echo “$var1 = $var2”; ?>
Kết quả hiển thị:
Length Hello:5
Hello = hello in a case-insensitive Hello < hello
11.4 Tạo Chuỗi Con, Tìm Và Thay Thế Chuỗi Con Bên Trong Chuỗi Cha
Hàm tạo chuỗi con:Hàm string substr (string S, int start [, int length]): trả về chuỗi con được thành lập tử chuỗi S với các tham số start và length. Nếu start >=0: sẽ trả về chuỗi bắt đầu từ vị trí start trong S.
<?
$rest = substr ("abcdef", 1); // returns "bcdef" $rest = substr ("abcdef", 1, 3); // returns "bcd" ?>
Nếu start <0: sẽ trả về chuỗi bắt đầu từ vị trí start của S tính từ cuối chuỗi. <?
$rest = substr ("abcdef", -1); // returns "f" $rest = substr ("abcdef", -2); // returns "ef" $rest = substr ("abcdef", -3, 1); // returns "d" ?>
Nếu length >=0 (giá trị mặc định là 0), chuỗi trả về có chiều dài length ký tự tính từ vị trí start.
Nếu length < 0: Chuỗi trả về chuỗi từ start tới vị trí kết thúc cách cuối chuỗi length ký tự.
Trong các trường hợp, nếu vị trí bắt đầu của chuỗi nhỏ hơn hay bằng vị trí cuối của chuỗi con cần chép, chuỗi trả về là rỗng.
<?php
$S = "abcdef"; //Xuất từng phần tử của chuỗi. for ($i=0; $i< strlen($S); $i++)
echo substr($S, $i, 1)." :"; echo "<hr>";
$rest = substr ("abcdef", 1, -1); //
echo "1.:" .$rest. " length:" . strlen($rest). "<br>"; //prints: 1.:bcde length:4
$rest = substr ("abcdef", 4, -3:);
echo "2:" .$rest. " length:" . strlen($rest) ."<br>"; //prints: 2: length0 $rest = substr ("abcdef", -3, -2);
echo "3:" .$rest. " length:" . strlen($rest). "<br>"; //3:d length:1 ?>
Các hàm tìm kiếm và thay thế trên chuỗi: Bao gồm tìm kiếm một chuỗi con có trong một chuỗi khác hay không, thay thế chuỗi con bằng một chuỗi khác.
Hàm string strstr (string S, string Sub): Trả về chuỗi có giá trị ở chuỗi S được tính từ vị trí tìm thấy chuỗi Sub trong đó cho đến cuối S. Nếu trong S có nhiều chuỗi Sub, hàm chỉ tính với Sub đầu tiên tìm được. Nếu Sub không có trong S, trả về false.
Ví dụ: <?
$email = 'sterling@designmultimedia.com'; $domain = strstr ($email, '@');
echo $domain; // prints @designmultimedia.com ?>
Hàm int strpos (string S, string Sub [, int offset]): Hàm trả về một số nguyên là vị trí đầu tiên của Sub trong S. Nếu Sub không có trong S, hàm trả về giá trị -1. Nếu có nhiều Sub trong S, hàm chỉ trả về vị trí đầu tiên. Tham số tuỳ chọn thứ 3 là một số nguyên chỉ vị trí bắt đầu
cần tìm Sub trong S. Nếu tham số này không có, tức là tìm từ vị trí 0 (tìm từ đầu chuỗi S). Một điều cần chú ý trong hàm này: Nếu vị trí tìm được của Sub trong S là 0, strpos() sẽ trả về giá trị 0. Giá trị này tương ứng với biến bool false, do vậy kết quả có thể bị hiểu sai. Để so sánh 2 trường hợp này, ta phải sử dụng toán tử so sánh === (3 dấu bằng) hoặc toán tử so sánh khác !== (2 dấu bằng).
Ví dụ: Tìm tất cả các vị trí của Sub trong S. <?
$S = "abc abdeab"; $Sub ="ab"; $pos = -1;
echo "Các vị trí <i>$Sub </i>trong <i> $S </i> là:" ; do
{
$pos = strpos($S, $Sub, $pos+1); if (!($pos === false))
echo " $pos"; }while ($pos !== false); ?>
Kết quả hiển thị: Các vị trí ab trong abc abdeab là: 0 4 8.
Các hàm thay thế: str_replace() và substr_replace().
Hàm string str_replace (string S1, string S2, string S): Hàm thay thế chuỗi S1 bằng chuỗi S2 trong chuỗi S. Trong trường hợp có nhiều S1 trong S, tất cả các S1 đều được thay bởi S2 (thay thế tất cả). Trong trường hợp chỉ muốn thay thế từ một vị trí nào đó, ta dùng hàm: substr_replace().
<?
$bodytag = str_replace ("%body%", "black", "<body text=%body%>"); //$bodytag = "<body text=%body%>”
?>
Hàm string substr_replace (string S, string Sub, int start [, int length]): Hàm này trả về một chuỗi có giá trị là chuỗi S được thay thế một phần bằng Sub. Giá trị trả về phụ thuộc vào 2 tham số start và length. Nếu start >= 0, chuỗi được thay thế từ vị trí ký tự start trong s tính từ đầu chuỗi. Nếu start < 0, chuỗi được thay thế từ vị trí ký tự start trong s tính từ cuối chuỗi. Nếu length >= 0 (mặc định =0): Chuỗi S từ start kéo dài length ký tự sẽ được thay thế bằng Sub. If length <0: Chuỗi S từ start đến vị trí chiều dài S – length sẽ được thay thế bằng Sub.
Ví dụ
<?
$var = 'ABCDEFGH:/MNRPQR/'; echo "Line 1: Original: $var<br>\n";
echo "Line 2: " .substr_replace ($var, 'bob', 0) . "<br>\n";
echo "Line 3: " .substr_replace ($var, 'bob', 0, strlen ($var))."<br>\n"; /* Insert 'bob' right at the beginning of $var. */
echo "Line 3: " .substr_replace ($var, 'bob', 0, 0) . "<br>\n"; /* These next two replace 'MNRPQR' in $var with 'bob'. */ echo "Line 4: " .substr_replace ($var, 'bob', 10, -1) . "<br>\n"; echo "Line 5: " .substr_replace ($var, 'bob', -7, -1) . "<br>\n"; /* Delete 'MNRPQR' from $var. */
echo "Line 6: " .substr_replace ($var, '', 10, -1) . "<br>\n"; ?>
Hiển thị tại trình duyệt:
Line 1: Original: ABCDEFGH:/MNRPQR/ Line 2: bob Line 3: bob Line 3: bobABCDEFGH:/MNRPQR/ Line 4: ABCDEFGH:/bob/ Line 5: ABCDEFGH:/bob/ Line 6: ABCDEFGH:// 11.5 Tách Chuỗi Thành Mảng
- Hàm tách chuỗi thành mảng các chuỗi con: Bằng cách đưa vào các chuỗi tách và chuỗi phân cách: array explode(string separator, string S): Hàm nhận vào 2 chuỗi. Chuỗi separator là chuỗi phân cách khi tách, S là chuỗi cần tách. Hàm trả về mảng có nội dung các phấn tử cũ mảng là các chuỗi con trong S tách ra.
Ví dụ: Tính số từ của chuỗi S. <?
$S = "Today is sunday";
$Arr_S = explode(" ", $S); // Các từ cách nhau bằng 1 khoảng trắng. $j=0;
while ($i=each($Arr_S)) {
if (strlen($i["value"])>0) {
printf("<br>|%3d | %10s |%3s|", $j, $i['value'] , strlen($i["value"])); $j++;
} }
echo “Có $j từ trong chuỗi $S”; ?>
- Hàm hợp các phần tử của mảng thành chuỗi: Các phần tử được ngăn cách bởi chuỗi phân cách (separator) string join(string glue, array pieces). Hàm trả về 1 chuỗi là
kết quả khi ghép liền các phần tử mảng pieces và các phần tử mảng này cách nhau bởi chuỗi “glue”.
Ví dụ:
<?
$pieces = array(“15th”, “August”, “2004”); $glue = “-“;
$S = join(glue, pieces); // $S=”15th-August-2004 “ echo $S;
?>
11.6 Một Số Phương Thức Hay Sử Dụng Khác Trên Chuỗi
- Loại bỏ các khoảng trắng trong chuỗi: Sử dụng các hàm string ltrim(string), string chop(string), string trim(string).
Hàm string ltrim(string S): trả về chuỗi S sau khi bỏ các khoảng trắng phía trái. Hàm string chop(string S): trả về chuỗi S sau khi bỏ các khoảng trắng phía phải. Hàm string trim(string S): trả về chuỗi S sau khi bỏ các khoảng trắng hai phía của chuỗi.
<?
$S=" A BC "; // S có chiều dài là 7.
$S1 = ltrim($S); // $S1="A BC "; chiều dài 6 $S1 = chop($S); // $S1=" A BC"; chiều dài 6 $S1 = trim($S); // $S1="A BC"; chiều dài 5 ?>
- Định dạng HTML cho chuỗi
Khi ta lấy chuỗi từ CSDL hay file ra chuỗi S và in S trên màn hình, các ký tự xuống hàng của S sẽ bị trình duyệt bỏ qua. Do vậy ta phải thay các ký tự xuống hàng này bằng thẻ xuống hàng tương ứng trong HTML là <BR>. Ta có thể sử dụng hàm string nl2br(string S): Nhận chuỗi S và trả về chuỗi đã thay các ký tự xuống hàng trong file bằng thẻ <BR>.
- Định dạng chuỗi để lưu vào CSDL: Khi lưu vào CSDL, ta phải loại bỏ hay thay thế các ký tự đặc biệt để đảm bảo hợp với qui tắc khi sử dụng các phát biểu SQL. Ví dụ, nếu muốn lưu một chuỗi có chứa các ký tự đặc biêt như dấu nháy đơn(‘), dấu nháy đôi (“), hay dấu slash (\), ta phải thay thế các dấu này bằng các chuỗi khác. Trường hợp này, nếu có dấu ‘, ta phải thêm thành \’, “ thành \”, dấu \ thành \\, …
Để thêm các dấu \ vào trước các ký tự đặc biệt đó, ta sử dụng hàm addslashes(). Hàm này có cú pháp như sau: string addslashes (string S). Trả về chuỗi đã thêm các dầu \ vào trước các ký tự đặc biệt trong chuỗi S.
Khi lấy từ CSDL ra để trình bày, ta phải loại bỏ các dấu \ đã thêm vào bằng hàm stripslashes. Cú pháp string stripslashes (string S).
Hàm string chr (int ASCII): trả về một ký tự có mã là tham số ASCII. <?
$str="abc";
$str .= chr (65); //str=”abcA”; ?>
Hàm int ord (string S): trả về giá trị là mã ASCII của ký tự đầu tiên trong chuỗi S. <?
$str="abc";
echo "Mã ASCII của ký tự đầu tiên trong chuỗi $str là:" . ord($str); ?>
Bài 12 SESSION – COOKIES