Chuỗi (String)

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:

NHÁY ĐƠN (' ') vs NHÁY KÉP (" ") NHÁY ĐƠN (' ') $ten = "An"; echo 'Xin chào $ten'; Kết quả: Xin chào $ten Đặc điểm: ❌ KHÔNG xử lý biến ❌ KHÔNG xử lý \n, \t ✅ Hiển thị nguyên văn ✅ Nhanh hơn 💡 Dùng cho chuỗi đơn giản NHÁY KÉP (" ") $ten = "An"; echo "Xin chào $ten"; Kết quả: Xin chào An Đặc điểm: ✅ Xử lý biến ($ten → An) ✅ Xử lý \n (xuống dòng) ✅ Xử lý \t (tab) ⚡ Chậm hơn (phải parse) 💡 Dùng khi cần biến/ký tự đặc biệt
Hình 1: Sự khác biệt giữa nháy đơn và nháy kép

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ĩaVí dụ
\nXuống dòng"Dòng 1\nDòng 2"
\rCarriage return"Text\r\n"
\tTab 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

CÁC NHÓM HÀM XỬ LÝ CHUỖI HOA / THƯỜNG strtoupper() HOA strtolower() thường ucfirst() Hoa đầu ucwords() Hoa mỗi từ lcfirst() thường đầu mb_strtoupper() HOA UTF-8 XÓA KHOẢNG TRẮNG trim() Đầu + cuối ltrim() Đầu rtrim() Cuối str_pad() Thêm ký tự chop() = rtrim() TÌM KIẾM strpos() Vị trí đầu strrpos() Vị trí cuối stripos() Không HOA str_contains() Có chứa? str_starts_with() Bắt đầu? str_ends_with() Kết thúc? THAY THẾ str_replace() Thay thế str_ireplace() Không HOA substr_replace() Thay vị trí strtr() Dịch ký tự preg_replace() Regex CẮT CHUỖI substr() Lấy phần mb_substr() UTF-8 substr_count() Đếm xuất hiện strstr() Tìm và lấy strchr() = strstr() TÁCH / NỐI explode() → Mảng implode() Mảng → join() = implode() str_split() Tách từng chunk_split() Chia khối wordwrap() Xuống dòng 💡 Tham khảo: https://www.php.net/manual/en/ref.strings.php
Hình 2: Các nhóm hàm xử lý chuỗi

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ế

CÁC THAO TÁC XỬ LÝ CHUỖI PHỔ BIẾN 1. NỐI CHUỖI $a = "PHP"; $b = "MySQL"; $c = $a . " và " . $b; → PHP và MySQL 2. ĐỘ DÀI $text = "Lập trình PHP"; strlen($text); → 14 ký tự 3. TÌM KIẾM $text = "Học PHP tại LapTrinh"; strpos($text, "PHP"); → 4 (vị trí) 4. THAY THẾ $text = "Học JS là khó"; str_replace("khó","dễ",$text); 5. CẮT CHUỖI $text = "Lập trình PHP"; substr($text, 0, 3); → Lập 6. TÁCH CHUỖI $csv = "PHP,JS,Python"; explode(",", $csv); → Array 7. HOA / THƯỜNG strtoupper("php"); → PHP strtolower("PHP"); → php 8. XÓA KHOẢNG TRẮNG $email = " test@a.com "; trim($email); → test@a.com 💡 Kết hợp các thao tác để xử lý chuỗi phức tạp
Hình 3: Các thao tác xử lý chuỗi phổ biến

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àmChức năngVí dụ
strlen()Độ dài chuỗistrlen("PHP") → 3
strtoupper()Chuyển HOAstrtoupper("php") → PHP
strtolower()Chuyển thườngstrtolower("PHP") → php
ucfirst()Hoa chữ đầuucfirst("php") → Php
ucwords()Hoa đầu mỗi từucwords("php js") → Php Js
trim()Xóa khoảng trắngtrim(" 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ỗisubstr("PHP",0,2) → PH
explode()Tách chuỗiexplode(",","a,b") → ["a","b"]
implode()Nối mảngimplode(",",["a","b"]) → a,b
str_contains()Kiểm tra chứastr_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ặc mb_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

  1. 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ừ.
  2. Bài 2: Viết hàm daoNguocChuoi($chuoi) đảo ngược chuỗi. VD: "PHP" → "PHP" (đọc ngược vẫn giống).
  3. 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
?>

Để lại bình luận

Email của bạn sẽ không được hiển thị.