0

PHP và MySQL Bài 10: Xử lý chuỗi (String Manipulation) - Nghệ thuật bóc tách và chuẩn hóa dữ liệu

Làm việc với cơ sở dữ liệu và API đồng nghĩa với việc bạn phải liên tục nhào nặn các chuỗi văn bản. PHP cung cấp một bộ công cụ xử lý chuỗi (String Functions) cực kỳ đồ sộ và mạnh mẽ. Dưới đây là những hàm thực tiễn nhất mà một Backend Developer sử dụng hàng ngày.


1. Đo lường và Làm sạch chuỗi

Khi nhận dữ liệu từ các thiết bị ngoại vi (như máy quét mã vạch) hoặc từ form nhập liệu, chuỗi thường đi kèm với các khoảng trắng thừa. Việc đầu tiên luôn là làm sạch và kiểm tra độ dài.

  • trim($string): Cắt bỏ khoảng trắng (hoặc các ký tự đặc biệt) ở cả hai đầu của chuỗi.
  • strlen($string): Trả về độ dài của chuỗi (số lượng ký tự).

💡 Ví dụ thực tế: Xác thực mã UID của thẻ NFC quét qua cổng kiểm soát. Mã chuẩn phải đúng 10 ký tự và không có khoảng trắng thừa.

<?php
    $rawCardUid = "  A1B2C3D4E5   ";
    
    // Bước 1: Làm sạch dữ liệu
    $cleanUid = trim($rawCardUid); 
    
    // Bước 2: Kiểm tra độ dài
    if (strlen($cleanUid) === 10) {
        echo "Mã thẻ hợp lệ: " . $cleanUid . "\n";
    } else {
        echo "Lỗi: Mã thẻ bị sai định dạng.";
    }
?>

2. Tìm kiếm và Thay thế (Search & Replace)

Đây là nhóm hàm giúp bạn "soi" vào bên trong một chuỗi để tìm kiếm một từ khóa, hoặc thay thế các ký tự không mong muốn.

  • strpos($string, $search): Tìm vị trí xuất hiện đầu tiên của một chuỗi con. Nếu không tìm thấy, nó trả về false.
  • str_replace($search, $replace, $string): Thay thế tất cả các từ khóa tìm được bằng một từ khóa mới.

⚠️ Lưu ý quan trọng: Hàm strpos() có thể trả về 0 (nếu từ khóa nằm ngay ở vị trí đầu tiên của chuỗi). Vì 0 trong PHP tương đương với false, bạn bắt buộc phải dùng toán tử so sánh đồng nhất !== false để kiểm tra.

💡 Ví dụ thực tế: Phân tích một dòng log ghi nhận lỗi từ Ticket Vending Machine (TVM) và ẩn đi các thông tin nhạy cảm.

<?php
    $errorLog = "Lỗi lúc 10:05 - ERR_CASH_BOX_JAM - Giao dịch ID: 998877 bị hủy.";

    // 1. Tìm kiếm xem đây có phải lỗi kẹt thiết bị (JAM) không
    if (strpos($errorLog, "JAM") !== false) {
        echo "[BÁO ĐỘNG]: Phát hiện lỗi kẹt thiết bị vật lý!\n";
    }

    // 2. Thay thế ẩn ID giao dịch trước khi lưu vào file log chung
    $safeLog = str_replace("998877", "******", $errorLog);
    echo "Log an toàn: " . $safeLog;
?>

3. Cắt và Tách chuỗi (Substring & Splitting)

Đây là kỹ năng "sống còn" khi bạn phải xử lý các chuỗi dữ liệu được quy ước theo một format nhất định (như file CSV, chuỗi token).

  • substr($string, $start, $length): Trích xuất một đoạn nhỏ từ chuỗi gốc, bắt đầu từ vị trí $start và cắt $length ký tự.
  • explode($separator, $string): Băm một chuỗi thành một Mảng (Array), chia cắt bởi ký tự $separator.
  • implode($separator, $array): Ngược lại với explode, gom các phần tử của một mảng lại thành một chuỗi.

💡 Ví dụ thực tế: Bóc tách dữ liệu từ một chuỗi mã hóa vé tàu (Ticket Hash). Giả sử mã vé có định dạng: MãTrạm_LoạiVé_NgàyTháng_ID.

<?php
    $ticketString = "ST05_ADULT_20260805_TXN8899";

    // 1. Dùng explode để băm chuỗi thành mảng dựa vào dấu gạch dưới "_"
    $ticketData = explode("_", $ticketString);
    
    echo "Trạm xuất vé: " . $ticketData[0] . "\n";
    echo "Loại vé: " . $ticketData[1] . "\n";

    // 2. Dùng substr để lấy riêng năm từ cụm ngày tháng (20260805)
    $dateString = $ticketData[2];
    $namXuatVe = substr($dateString, 0, 4); // Lấy 4 ký tự từ vị trí số 0
    echo "Năm xuất vé: " . $namXuatVe . "\n";
    
    // 3. Dùng implode để gom lại thành file CSV
    $csvRow = implode(",", $ticketData);
    echo "Dữ liệu lưu CSV: " . $csvRow; 
?>

4. Chuyển đổi chữ Hoa / chữ Thường

Khi so sánh các mã định danh, người dùng có thể nhập chữ hoa hoặc chữ thường lộn xộn. Để tránh lỗi logic, nguyên tắc là phải quy chuẩn tất cả về cùng một định dạng trước khi so sánh.

  • strtolower($string): Chuyển toàn bộ thành chữ thường.
  • strtoupper($string): Chuyển toàn bộ thành chữ in hoa.
  • ucfirst($string): Viết hoa chữ cái đầu tiên của chuỗi.
<?php
    $inputStationCode = "sT05"; // Người dùng nhập lỗi
    $validStationCode = "ST05";
    
    // Chuẩn hóa input thành in hoa toàn bộ trước khi so sánh
    if (strtoupper($inputStationCode) === $validStationCode) {
        echo "Mã trạm hợp lệ!";
    }
?>

Tổng kết Bài 10

Xử lý chuỗi là thao tác bạn sẽ sử dụng trong 99% các API mà bạn viết sau đây. Hãy ghi nhớ bộ 3 quyền lực: explode() (băm chuỗi), strpos() (tìm kiếm) và substr() (cắt chuỗi).

Khi đã biết cách thao tác với dữ liệu văn bản, chúng ta sẽ bước sang một khía cạnh dữ liệu phức tạp hơn nhưng không kém phần quan trọng. Bài học tiếp theo sẽ là Bài 11: Xử lý thời gian và ngày tháng (date, time, strtotime, múi giờ) – bài toán đau đầu bậc nhất trong thiết kế hệ thống phân tán.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí