Sau khi nắm vững mảng trong PHP, bước tiếp theo là học cách xử lý dữ liệu văn bản với chuỗi trong PHP. Chuỗi là kiểu dữ liệu quan trọng nhất khi làm việc với web – từ hiển thị tên người dùng, validate email, xử lý URL, đến tạo slug cho bài viết. Hiểu rõ cách thao tác với chuỗi sẽ giúp bạn xây dựng các tính năng như tìm kiếm, lọc dữ liệu, format text và xử lý form một cách hiệu quả.
1. Chuỗi là gì?
Chuỗi (String) là một chuỗi ký tự – có thể là chữ cái, số, ký tự đặc biệt hoặc khoảng trắng. Trong PHP, chuỗi được bao bọc bởi dấu nháy đơn hoặc nháy kép:
<?php
// Khai báo chuỗi
$ten = "Nguyễn Văn A";
$email = 'test@email.com';
$dia_chi = "123 Đường ABC, Quận 1, TP.HCM";
// Chuỗi chứa số
$so_dien_thoai = "0912345678";
// Chuỗi rỗng
$chuoi_rong = "";
// Chuỗi nhiều dòng
$mo_ta = "Dòng 1
Dòng 2
Dòng 3";
?>2. Dấu nháy đơn vs Dấu nháy kép
Đây là điểm khác biệt quan trọng nhất khi làm việc với chuỗi trong PHP:
2.1. Dấu nháy đơn (‘ ‘)
Hiển thị nguyên văn, không xử lý biến và ký tự đặc biệt:
<?php
$ten = "An";
// Nháy đơn - Không xử lý biến
echo 'Xin chào $ten'; // Kết quả: Xin chào $ten
// Không xử lý ký tự đặc biệt
echo 'Dòng 1\nDòng 2'; // Kết quả: Dòng 1\nDòng 2
// Muốn dùng dấu nháy đơn trong chuỗi
echo 'It\'s a beautiful day'; // It's a beautiful day
// Ưu điểm: Nhanh hơn (không phải parse)
$chuoi = 'PHP là ngôn ngữ lập trình web';
?>2.2. Dấu nháy kép (” “)
Xử lý biến và ký tự đặc biệt:
<?php
$ten = "An";
$tuoi = 20;
// Nháy kép - Xử lý biến
echo "Xin chào $ten"; // Kết quả: Xin chào An
// Xử lý nhiều biến
echo "Tên: $ten, Tuổi: $tuoi"; // Tên: An, Tuổi: 20
// Xử lý ký tự đặc biệt
echo "Dòng 1\nDòng 2"; // Xuống dòng thật
echo "Tab\tTab"; // Thêm tab
// Biến trong chuỗi phức tạp
$sv = ["ten" => "Bình"];
echo "Sinh viên: {$sv['ten']}"; // Sinh viên: Bình
// Escape dấu nháy kép
echo "Anh ấy nói: \"Xin chào\""; // Anh ấy nói: "Xin chào"
?>2.3. Ký tự đặc biệt (Escape Sequences)
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
\n | Xuống dòng | "Dòng 1\nDòng 2" |
\r | Carriage return | "Text\r\n" |
\t | Tab ngang | "Cột 1\tCột 2" |
\\ | Dấu backslash | "C:\\xampp" |
\" | Dấu nháy kép | "He said \"Hi\"" |
\' | Dấu nháy đơn | 'It\'s OK' |
\$ | Dấu $ | "Giá \$100" |
2.4. Heredoc và Nowdoc
Chuỗi nhiều dòng không cần escape:
<?php
// Heredoc (giống nháy kép - xử lý biến)
$ten = "An";
$html = <<<HTML
<div class="user">
<h2>Xin chào $ten</h2>
<p>Chào mừng đến với PHP!</p>
</div>
HTML;
echo $html;
// Nowdoc (giống nháy đơn - không xử lý biến)
$text = <<<'TEXT'
Xin chào $ten
Không xử lý biến
TEXT;
echo $text; // Xin chào $ten
?>💡 Khuyến nghị:
– Dùng nháy đơn cho chuỗi đơn giản (nhanh hơn)
– Dùng nháy kép khi cần biến hoặc ký tự đặc biệt
– Dùng Heredoc cho HTML nhiều dòng
3. Nối chuỗi (Concatenation)
Kết hợp nhiều chuỗi thành một:
<?php
// Cách 1: Dùng toán tử .
$ho = "Nguyễn";
$ten = "Văn A";
$ho_ten = $ho . " " . $ten;
echo $ho_ten; // Nguyễn Văn A
// Cách 2: Dùng toán tử .=
$chuoi = "PHP";
$chuoi .= " là";
$chuoi .= " ngôn ngữ";
$chuoi .= " lập trình";
echo $chuoi; // PHP là ngôn ngữ lập trình
// Cách 3: Dùng nháy kép (khuyến nghị khi ít biến)
$tuoi = 20;
echo "Tôi tên $ho_ten, năm nay $tuoi tuổi";
// Cách 4: Dùng sprintf (format chuỗi)
$thong_tin = sprintf("Tên: %s, Tuổi: %d", $ho_ten, $tuoi);
echo $thong_tin;
// Nối nhiều chuỗi
$result = "A" . "B" . "C" . "D" . "E";
echo $result; // ABCDE
?>4. Độ dài và truy cập ký tự
<?php
$chuoi = "Lập trình PHP";
// Đếm độ dài chuỗi
echo strlen($chuoi); // 14 (có dấu cách)
// Đếm ký tự Unicode (tiếng Việt)
echo mb_strlen($chuoi); // 14
// Truy cập ký tự theo index (bắt đầu từ 0)
echo $chuoi[0]; // L
echo $chuoi[1]; // ậ
echo $chuoi[4]; // t
// Ký tự cuối cùng
echo $chuoi[strlen($chuoi) - 1]; // P
// Sửa ký tự
$chuoi[0] = "C";
echo $chuoi; // Cập trình PHP
// Lặp qua từng ký tự
for ($i = 0; $i < strlen($chuoi); $i++) {
echo $chuoi[$i] . " ";
}
?>5. Các hàm xử lý chuỗi quan trọng
5.1. Hàm chuyển đổi chữ hoa/thường
<?php
$text = "Lập Trình PHP";
// Chuyển toàn bộ sang HOA
echo strtoupper($text); // LẬP TRÌNH PHP
// Chuyển toàn bộ sang thường
echo strtolower($text); // lập trình php
// Viết hoa chữ cái đầu
echo ucfirst("nguyễn văn a"); // Nguyễn văn a
// Viết hoa chữ cái đầu mỗi từ
echo ucwords("nguyễn văn a"); // Nguyễn Văn A
// Đảo ngược hoa thường
echo strtolower("ABC") . strtoupper("xyz"); // abcXYZ
?>5.2. Hàm loại bỏ khoảng trắng
<?php
$email = " test@email.com ";
// Xóa khoảng trắng đầu và cuối
echo trim($email); // test@email.com
// Xóa khoảng trắng đầu
echo ltrim($email); // "test@email.com "
// Xóa khoảng trắng cuối
echo rtrim($email); // " test@email.com"
// Xóa ký tự cụ thể
echo trim("---Hello---", "-"); // Hello
// Xóa nhiều ký tự
echo trim("123ABC321", "123"); // ABC
?>5.3. Hàm tìm kiếm trong chuỗi
<?php
$chuoi = "Học lập trình PHP tại laptrinhkhongkho.com";
// Tìm vị trí xuất hiện đầu tiên
$vi_tri = strpos($chuoi, "PHP");
echo $vi_tri; // 14
// Kiểm tra chuỗi con tồn tại
if (strpos($chuoi, "PHP") !== false) {
echo "Có chứa PHP";
}
// Tìm vị trí xuất hiện cuối cùng
echo strrpos($chuoi, "t"); // 36
// Tìm không phân biệt hoa thường
echo stripos($chuoi, "php"); // 14
// Đếm số lần xuất hiện
echo substr_count($chuoi, "nh"); // 3 (trình, lành, kho)
// Kiểm tra bắt đầu bằng (PHP 8+)
var_dump(str_starts_with($chuoi, "Học")); // true
// Kiểm tra kết thúc bằng (PHP 8+)
var_dump(str_ends_with($chuoi, ".com")); // true
// Kiểm tra chứa chuỗi con (PHP 8+)
var_dump(str_contains($chuoi, "PHP")); // true
?>5.4. Hàm thay thế chuỗi
<?php
$text = "Học JavaScript là khó";
// Thay thế đơn giản
$new = str_replace("khó", "dễ", $text);
echo $new; // Học JavaScript là dễ
// Thay thế không phân biệt hoa thường
$text2 = "PHP php Php";
echo str_ireplace("php", "Java", $text2); // Java Java Java
// Thay thế nhiều chuỗi
$find = ["khó", "JavaScript"];
$replace = ["dễ", "PHP"];
echo str_replace($find, $replace, $text); // Học PHP là dễ
// Đếm số lần thay thế
$count = 0;
str_replace("a", "b", "banana", $count);
echo $count; // 3
?>5.5. Hàm cắt chuỗi
<?php
$chuoi = "Lập trình PHP";
// Lấy chuỗi con từ vị trí
echo substr($chuoi, 0, 3); // Lập (từ vị trí 0, lấy 3 ký tự)
echo substr($chuoi, 4, 5); // trình
echo substr($chuoi, 10); // PHP (từ vị trí 10 đến hết)
// Lấy từ cuối
echo substr($chuoi, -3); // PHP (3 ký tự cuối)
echo substr($chuoi, -7, 5); // trình
// Cắt chuỗi Unicode (tiếng Việt)
echo mb_substr($chuoi, 0, 3); // Lập
// Lấy ký tự đầu tiên
echo substr($chuoi, 0, 1); // L
?>5.6. Hàm tách và nối chuỗi
<?php
// Tách chuỗi thành mảng
$csv = "PHP,JavaScript,Python,Java";
$mang = explode(",", $csv);
print_r($mang); // ["PHP", "JavaScript", "Python", "Java"]
// Nối mảng thành chuỗi
$ngon_ngu = ["PHP", "JavaScript", "Python"];
echo implode(", ", $ngon_ngu); // PHP, JavaScript, Python
echo implode(" - ", $ngon_ngu); // PHP - JavaScript - Python
// Tách theo nhiều ký tự
$text = "PHP, JavaScript; Python | Java";
$arr = preg_split("/[,;|]/", $text);
print_r($arr);
// Tách theo khoảng trắng
$ho_ten = "Nguyễn Văn A";
$parts = explode(" ", $ho_ten);
echo $parts[0]; // Nguyễn (họ)
echo $parts[2]; // A (tên)
?>5.7. Hàm so sánh chuỗi
<?php
$a = "PHP";
$b = "php";
// So sánh phân biệt hoa thường
echo strcmp($a, $b); // -32 (khác nhau)
echo strcmp($a, "PHP"); // 0 (giống nhau)
// So sánh không phân biệt hoa thường
echo strcasecmp($a, $b); // 0 (giống nhau)
// So sánh n ký tự đầu
echo strncmp("Hello World", "Hello PHP", 5); // 0 (5 ký tự đầu giống)
// Ví dụ thực tế: Sắp xếp mảng chuỗi
$ngon_ngu = ["Python", "JavaScript", "PHP", "Java"];
usort($ngon_ngu, function($a, $b) {
return strcmp($a, $b);
});
print_r($ngon_ngu); // Java, JavaScript, PHP, Python
?>6. Kiểm tra và validate chuỗi
<?php
// Kiểm tra chuỗi rỗng
$chuoi = "";
var_dump(empty($chuoi)); // true
// Kiểm tra chỉ chứa khoảng trắng
$spaces = " ";
var_dump(trim($spaces) === ""); // true
// Kiểm tra số
$so = "12345";
var_dump(is_numeric($so)); // true
var_dump(ctype_digit($so)); // true
// Kiểm tra chữ cái
var_dump(ctype_alpha("ABC")); // true
var_dump(ctype_alpha("ABC123")); // false
// Kiểm tra chữ và số
var_dump(ctype_alnum("ABC123")); // true
// Validate email
$email = "test@email.com";
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); // test@email.com
// Validate URL
$url = "https://laptrinhkhongkho.com";
var_dump(filter_var($url, FILTER_VALIDATE_URL)); // URL string
?>7. Ví dụ thực tế
7.1. Tạo slug từ tiêu đề
<?php
function taoSlug($tieu_de) {
// Chuyển thường
$slug = strtolower($tieu_de);
// Loại bỏ dấu tiếng Việt (đơn giản hóa)
$slug = str_replace(
['á','à','ả','ã','ạ','ă','ắ','ằ','ẳ','ẵ','ặ','â','ấ','ầ','ẩ','ẫ','ậ'],
'a', $slug
);
$slug = str_replace(
['é','è','ẻ','ẽ','ẹ','ê','ế','ề','ể','ễ','ệ'],
'e', $slug
);
// ... (các chữ cái khác)
// Thay khoảng trắng thành dấu gạch ngang
$slug = str_replace(' ', '-', $slug);
// Xóa ký tự đặc biệt
$slug = preg_replace('/[^a-z0-9\-]/', '', $slug);
// Xóa gạch ngang liên tiếp
$slug = preg_replace('/-+/', '-', $slug);
// Xóa gạch ngang đầu/cuối
$slug = trim($slug, '-');
return $slug;
}
echo taoSlug("Lập trình PHP không khó");
// lap-trinh-php-khong-kho
?>7.2. Rút gọn văn bản
<?php
function rutGonText($text, $max_length = 100) {
// Loại bỏ HTML tags
$text = strip_tags($text);
// Nếu ngắn hơn max, return nguyên
if (strlen($text) <= $max_length) {
return $text;
}
// Cắt và thêm ...
$text = substr($text, 0, $max_length);
// Tìm khoảng trắng cuối cùng để không cắt giữa từ
$last_space = strrpos($text, ' ');
if ($last_space !== false) {
$text = substr($text, 0, $last_space);
}
return $text . '...';
}
$mo_ta = "Đây là một đoạn văn bản rất dài, chứa nhiều thông tin quan trọng về lập trình PHP và các kỹ thuật xử lý chuỗi hiệu quả.";
echo rutGonText($mo_ta, 50);
// Đây là một đoạn văn bản rất dài, chứa nhiều...
?>7.3. Mask số điện thoại
<?php
function maskPhone($phone) {
// Lấy 3 số đầu và 3 số cuối
$start = substr($phone, 0, 3);
$end = substr($phone, -3);
// Tính số * cần thêm
$middle_length = strlen($phone) - 6;
$middle = str_repeat('*', $middle_length);
return $start . $middle . $end;
}
echo maskPhone("0912345678"); // 091****678
echo maskPhone("0987654321"); // 098****321
?>7.4. Highlight từ khóa tìm kiếm
<?php
function highlightKeyword($text, $keyword) {
// Không phân biệt hoa thường
$pattern = "/(" . preg_quote($keyword, '/') . ")/i";
$replacement = '<mark>$1</mark>';
return preg_replace($pattern, $replacement, $text);
}
$text = "Học lập trình PHP tại laptrinhkhongkho.com. PHP là ngôn ngữ phổ biến.";
echo highlightKeyword($text, "PHP");
// Học lập trình <mark>PHP</mark> tại laptrinhkhongkho.com. <mark>PHP</mark> là ngôn ngữ phổ biến.
?>7.5. Tạo mật khẩu ngẫu nhiên
<?php
function taoMatKhau($length = 12) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*';
$password = '';
$chars_length = strlen($chars);
for ($i = 0; $i < $length; $i++) {
$password .= $chars[rand(0, $chars_length - 1)];
}
return $password;
}
echo taoMatKhau(16); // aB3$kL9@mN2^pQ8!
echo taoMatKhau(8); // X7k$mP2@
?>7.6. Format tiền tệ
<?php
function formatTien($so) {
return number_format($so, 0, ',', '.') . ' VNĐ';
}
echo formatTien(1500000); // 1.500.000 VNĐ
echo formatTien(250000); // 250.000 VNĐ
// Hoặc dùng cho USD
function formatUSD($so) {
return '$' . number_format($so, 2, '.', ',');
}
echo formatUSD(1234.56); // $1,234.56
?>8. Bảng tổng hợp hàm chuỗi
| Hàm | Chức năng | Ví dụ |
|---|---|---|
strlen() | Độ dài chuỗi | strlen("PHP") → 3 |
strtoupper() | Chuyển HOA | strtoupper("php") → PHP |
strtolower() | Chuyển thường | strtolower("PHP") → php |
ucfirst() | Hoa chữ đầu | ucfirst("php") → Php |
ucwords() | Hoa đầu mỗi từ | ucwords("php js") → Php Js |
trim() | Xóa khoảng trắng | trim(" PHP ") → PHP |
strpos() | Tìm vị trí | strpos("PHP", "P") → 0 |
str_replace() | Thay thế | str_replace("a","b","ab") → bb |
substr() | Cắt chuỗi | substr("PHP",0,2) → PH |
explode() | Tách chuỗi | explode(",","a,b") → ["a","b"] |
implode() | Nối mảng | implode(",",["a","b"]) → a,b |
str_contains() | Kiểm tra chứa | str_contains("PHP","P") → true |
Tóm tắt
Qua bài này bạn đã nắm được:
- ✅ Chuỗi trong PHP là kiểu dữ liệu lưu trữ văn bản, bao bọc bởi nháy đơn hoặc nháy kép
- ✅ Nháy đơn (''): Hiển thị nguyên văn, nhanh hơn
- ✅ Nháy kép (""): Xử lý biến và ký tự đặc biệt (
\n,\t) - ✅ Nối chuỗi: Dùng toán tử
.hoặc.= - ✅ Độ dài:
strlen()hoặcmb_strlen()cho Unicode - ✅ Chuyển đổi:
strtoupper(),strtolower(),ucfirst(),ucwords() - ✅ Tìm kiếm:
strpos(),str_contains(),str_starts_with(),str_ends_with() - ✅ Thay thế:
str_replace(),str_ireplace() - ✅ Cắt chuỗi:
substr(),mb_substr() - ✅ Tách/Nối:
explode(),implode() - ✅ Validate:
filter_var(),ctype_digit(),ctype_alpha()
Bài tiếp theo, bạn sẽ học về Form và GET/POST trong PHP để xử lý dữ liệu người dùng nhập vào.
🎯 Bài tập thực hành
- Bài 1: Viết hàm
demTu($chuoi)đếm số từ trong một chuỗi. VD: "Học PHP không khó" → 4 từ. - Bài 2: Viết hàm
daoNguocChuoi($chuoi)đảo ngược chuỗi. VD: "PHP" → "PHP" (đọc ngược vẫn giống). - Bài 3: Viết hàm
kiemTraPalindrome($chuoi)kiểm tra chuỗi có phải palindrome không (đọc xuôi ngược giống nhau). VD: "madam" → true, "hello" → false.
Gợi ý Bài 1:
<?php
function demTu($chuoi) {
// Loại bỏ khoảng trắng thừa
$chuoi = trim($chuoi);
// Nếu chuỗi rỗng
if ($chuoi === "") {
return 0;
}
// Tách thành mảng theo khoảng trắng
$mang_tu = explode(" ", $chuoi);
// Lọc bỏ phần tử rỗng
$mang_tu = array_filter($mang_tu);
return count($mang_tu);
}
echo demTu("Học PHP không khó"); // 4
echo demTu(" A B C "); // 3
?>Gợi ý Bài 2:
<?php
function daoNguocChuoi($chuoi) {
return strrev($chuoi);
}
echo daoNguocChuoi("PHP"); // PHP
echo daoNguocChuoi("Hello"); // olleH
?>Gợi ý Bài 3:
<?php
function kiemTraPalindrome($chuoi) {
// Chuyển thường và loại bỏ khoảng trắng
$chuoi = strtolower(str_replace(" ", "", $chuoi));
// So sánh với chuỗi đảo ngược
return $chuoi === strrev($chuoi);
}
var_dump(kiemTraPalindrome("madam")); // true
var_dump(kiemTraPalindrome("hello")); // false
var_dump(kiemTraPalindrome("A man a plan a canal Panama")); // true
?>