Xâu – Các phép toán thường gặp
Tớ xin nhắc lại một cách ngắn gọn: Xâu là một tập hợp các ký tự. Ví dụ "abc", "sadfsks12dsfsdfjkee123" có thể coi là một xâu. Trong PHP, xâu được thể hiện bằng mã ký tự 8 bit (8-bit character code) và được coi là nằm trong bảng mã ISO-8859-1.
Giờ ta hãy xem xem xét một số phép toán thường gặp trên xâu:
1. strlen – lấy độ dài 1 xâu
Có lẽ các bạn cũng dễ dàng đoán được, strlen là string length – độ dài xâu. Cách sử dụng hàm strlen() rất đơn giản:
PHP Code:
echo strlen("Updatesofts");
?>
Kết quả in ra sẽ là 11 – số ký tự trong xâu "Updatesofts".
2. trim – cắt bỏ phần thừa trong xâu
Hàm trim() nhận tham số là 1 xâu và nó sẽ loại bỏ mọi khoảng trắng (whitespace) bắt đầu và kết thúc xâu. Cần chú ý ở đây, khoảng trằng ko chỉ bao gồm dấu cách (" ", mang mã ASCII 32) mà nó còn gồm:
– Tab ("\t", mã ASCII 9)
– Dấu xuống dòng ("\r" và "\n", mã tương ứng 10 và 13)
– Ký tự NULL ("\0", mã 0)
– Tab dọc (vertical tab – mã 11). Dấu này giờ là "của hiếm". ấu
Ví dụ:
PHP Code:
$str = " \t\t\t\t \nXâu này lắm thứ linh tinh thế nhở \r\n \t \t ";
echo trim($str);
?>
Kết quả output ra hoàn toàn có thể đoán được: "Xâu này lắm thứ linh tinh thế nhở"
3. ltrim và rtrim
Sau khi biết về hàm trim(), chắc hẳn bạn sẽ đặt câu hỏi: Thế nhỡ tớ chỉ muốn cắt bỏ mấy phần linh tinh ở đầu/cuối xâu thôi thì sao?
Trả lời: Hoàn toàn có thể. Hãy dùng ltrim() và rtrim() – bạn sẽ thik ngay mà
ltrim dùng để bỏ các phần linh tinh bắt đầu xâu.
rtrim dùng để bỏ các phần linh tinh kết thúc xâu.
4. strpos – tìm kiếm trong xâu
Hàm strpos() nhận 3 tham số:
1. 1 xâu
2. xâu cần tìm trong xâu trên
3. bắt đầu tìm từ ký tự thứ mấy trong xâu, mặc định là 0
Ví dụ strpos("Updatesofts", "Update") sẽ trả về kết quả là 0. strpos("ABCABC", "A", 2) sẽ trả về kết quả là 3.
Vậy nếu ko tồn tại xâu cần tìm thì sao? Đơn giản lắm bạn ạ, kết quả trả về sẽ là FALSE.
Một điều cần chú ý nữa: Nếu vị trí bắt đầu tìm là số âm (ví dụ -1), PHP sẽ tìm kiếm từ cuối xâu trở lại (ngược với cách tìm mặc định)
Giờ hãy xét 1 ví dụ:
PHP Code:
$res = strpos($haystack, $needle);
if ($res == FALSE) {
echo "Ko thấy!";
} else {
echo "Thấy òi!";
}
?>
Bạn có $haystack là "Updatesofts", $needle là "Up", hỏi PHP sẽ echo ra cái gì? Bạn đoán là "Thấy òi" đúng ko?
Tiếc là sai rồi bạn ạ Kết quả là "Ko thấy", vì $needle được tìm thấy ở ĐẦU $haystack, nghĩa là vị trí thứ 0, mà 0 lại đồng nghĩa với FALSE
Khá là confusing phải ko hả bạn?
Để xử lý trường hợp này, ta sẽ dùng toán tử so sánh === thay vì == (bằng bằng bằng thay vì bằng bằng ). PHP sẽ kiểm tra cả giá trị và kiểu của biến, do đó 0 và FALSE sẽ là 2 khái niệm hoàn toàn khác nhau và vấn đề đã được giải quyết gọn ghẽ.
5. substr – tách (extract) 1 phần trong xâu
Cú pháp của hàm substr() như sau:
substr(xâu, vị trí bắt đầu, [số ký tự – nếu cần])
Ví dụ: substr($str, 1) trả về xâu bắt đầu từ ký tự thứ 1. substr($str, 3, 2) trả về 2 ký tự của xâu bắt đầu từ ký tự thứ 3.
Cũng như strpos, tham số thứ 2 có thể là âm. Khi đó PHP sẽ xử lý ngược từ cuối.
Trên đây là 5 hàm thường gặp khi xử lý xâu trong PHP. Hiển nhiên việc liệt kê tất cả các hàm là impossible, vì vậy nếu bạn cần thêm về các hàm xử lý xâu trong PHP, hãy tìm đến PHP.net:
http://www.php.net/manual/en/ref.strings.php
Coming Up Next: Sử dụng Regular Expression để tìm kiếm và thay thế trong xâu.
Xâu – Các phép toán thường gặp (tiếp)
Các hàm làm việc với xâu (string)
So sánh 2 xâu
Để so sánh 2 xâu với nhau, ta sử dụng strcmp và strncmp
PHP Code:
strcmp($xâu_1, $xâu_2);
strncmp($xâu_1, $xâu_2, $n);
Hàm strcmp sẽ chuyển từng kí tự trong 2 xâu về dạng mã byte của mỗi kí tự để so sánh, nó sẽ trả về 1 trong 3 giá trị:
- (-1) nếu $xâu_1 "bé hơn" $xâu_2
- 0 nếu 2 xâu "bằng nhau"
- 1 nếu $xâu_1 "lớn hơn" $xâu_2
Hàm strncmp cũng hoạt động tương tự, nhưng nó sẽ không kiểm tra hết cả 2 xâu mà chỉ kiểm tra $n kí tự đầu tiên mà thôi
Để dễ hiểu hơn, ta có ví dụ sau đây:
PHP Code:
$strA = 'Update softs';
$strB = 'update softs';
$strC = 'tpdate softs';
$strD = '';
$strE = '';
$strF = 'Update life';
//So sánh A và B: mã của "U" < mã của "u" ~> đự doán là $resultAB = -1
$resultAB = strcmp($strA, $strB);
//So sánh B và C: mã của "u" > mã của "t" ~> dự đoán là $resultBC = 1
$resultBC = strcmp($strB, $strC);
//So sánh D và E: 2 thằng cùng không có gì ~> dự đoán là $resultDE = 0
$resultDE = strcmp($strD, $strE);
//So sánh A và F (6 kí tự đầu tiên): 6 kí tự đầu tiên giống nhau ~> dự đoán là $resultAF = 0
$resultAF = strncmp($strA, $strF, 6);
//In ra kết quả
echo "\$resultAB = $resultAB
\$resultBC = $resultBC
\$resultDE = $resultDE
\$resultAF = $resultAF";
?>
Cho chạy đoạn mã trên bạn sẽ thu được:
Quote:
$resultAB = -1 |
Vậy là đúng rồi nhỉ?
Ngoài 2 hàm strcmp và strncmp còn có 1 vài hàm khác cũng dùng để so sánh 2 xâu với nhau tuy nhiên mỗi hàm lại khác nhau 1 tí tẹo:
- strcasecmp và strncasecmp: 2 bạn này chỉ khác ở 1 điểm, đó là nó sẽ không phân biệt hoa thường ~> nếu trong ví dụ so sánh $strA và $strB mà dùng strcasecmp thì sẽ nhận đc kết là 0
- strnatcmp và strnatcasecmp: 2 anh bạn này thì khá hay đấy. Giả sử bạn có 2 xâu là "filename10" và "filename9".
Nếu dùng strcmp thì do mã của "1" nhỏ hơn "9" nên hiển nhiên kết quả sẽ là "filename10" nhỏ hơn "filename9"! Bạn sẽ lẩm bẩm: "Làm việc như máy (!?)". Nhưng không sao, chúng ta đã có 2 hàm strnatcmpvà strnatcasecmp có khả năng làm việc như strcmp và strcasecmp cộng thêm khả năng xử lý số đặc biệt.
Với strnatcmp thì "filename10" sẽ lớn hơn "filename9", với strncasecmp thì "Filename10" sẽ lớn hơn "fileNAME9"
Đơn giản vậy thôi
Chữ HOA và chữ thường
Khi làm việc, đôi lúc bạn không muốn để ý đến chữ HOA và chữ thường, cách đơn giản nhất là sử dụng 2 hàm chuyển đổi sau:
PHP Code:
strtoupper($xâu);
strtolower($xâu);
Hàm strtoupper khi chạy sẽ trả về $xâu với tất cả các kí tự đều là kí tự HOA, hàm strtolower thì ngược lại, sẽ trả về $xâu với tất cả các kí tự đều là kí tự thường
Xét ví dụ sau đây:
PHP Code:
$str = "UpDAteSoftS";
echo strtoupper($str);
echo "
";
echo strtolower($str);
?>
Kết quả thu đc sẽ là:
Quote:
UPDATESOFTS |
*Note:
Để nối 2 xâu lại với nhau ta dùng toán tử .
Trong ví dụ cuối cùng có thể viết gọn lại là:
PHP Code:
$str = "UpDAteSoftS";
echo strtoupper($str)."
".strtolower($str);
?>
Kết quả thu được vẫn sẽ như vậy
Mr.paint(UDS)