Lập trình · 26/09/2026

PHP strpos: Vị trí 0 không có nghĩa là không tìm thấy

Bộ lọc tìm tiêu đề chứa từ PHP hoạt động với “Học PHP”, nhưng bỏ sót “PHP cơ bản”. Đây là một lỗi nhỏ, dễ lọt qua kiểm thử: kết quả tìm thấy ở đầu chuỗi là số 0 và bị điều kiện if xem như false.

PHP strpos: Vị trí 0 không có nghĩa là không tìm thấy

Bộ lọc tìm tiêu đề chứa từ PHP hoạt động với “Học PHP”, nhưng bỏ sót “PHP cơ bản”. Đây là một lỗi nhỏ, dễ lọt qua kiểm thử: kết quả tìm thấy ở đầu chuỗi là số 0 và bị điều kiện if xem như false.

1. strpos trả vị trí, không chỉ trả có hoặc không

Theo tài liệu PHP về strpos, kết quả là vị trí bắt đầu từ 0 nếu tìm thấy, hoặc false nếu không tìm thấy. Vì thế cần so sánh nghiêm ngặt để phân biệt hai trường hợp.

$title = 'PHP basics';
$position = strpos($title, 'PHP');

var_dump($position);           // int(0)
var_dump($position !== false); // bool(true)
var_dump((bool) $position);    // bool(false)

Không dùng if ($position) khi ý định là kiểm tra có xuất hiện. Tương tự, điều kiện $position > 0 chỉ đúng với kết quả nằm sau vị trí đầu tiên, không đại diện cho mọi trường hợp tìm thấy.

2. Chỉ cần biết có chứa: dùng str_contains

Trên PHP 8 trở lên, str_contains trả về Boolean và phân biệt chữ hoa, chữ thường. Khi không cần vị trí để cắt chuỗi hoặc xử lý tiếp, cách viết này diễn đạt ý định rõ hơn:

$title = 'PHP basics';

if (str_contains($title, 'PHP')) {
    echo 'Matched';
}

Đừng thay mọi strpos một cách máy móc. Một đoạn code đang dùng vị trí tìm được để lấy phần văn bản phía sau vẫn cần thông tin số, không chỉ một giá trị true hoặc false.

3. Quy định riêng cho từ khóa rỗng

str_contains coi chuỗi tìm kiếm rỗng là khớp. Nhưng một biểu mẫu tìm kiếm có thể yêu cầu người dùng nhập từ khóa trước. Hành vi thư viện không tự quyết định quy tắc sản phẩm.

function matchesTitle(string $title, string $query): bool
{
    $query = trim($query);
    if ($query === '') {
        return false;
    }

    return str_contains($title, $query);
}

Trong ví dụ, chỉ từ khóa được trim; tiêu đề được giữ nguyên. Hàm chủ động từ chối từ khóa rỗng và không tự chuyển chữ hoa, chữ thường. Khi nhận dữ liệu HTTP, kiểm tra kiểu đầu vào trước khi gọi hàm, không giả định tham số truy vấn luôn là chuỗi.

4. Tìm chuỗi con không phải hiểu ý nghĩa dữ liệu

Từ khóa “cat” cũng nằm trong “catalog”. Nếu yêu cầu là tìm nguyên từ, tìm không dấu hoặc tìm theo ngôn ngữ, hãy thiết kế quy tắc tương ứng và có bộ dữ liệu kiểm thử riêng. Không quảng bá một phép kiểm tra chuỗi con thành công cụ tìm kiếm đầy đủ.

Đặc biệt, không dùng “chuỗi có chứa tên miền tin cậy” để cho phép redirect. Một địa chỉ khác cũng có thể chứa đoạn chữ đó trong đường dẫn hoặc tên miền dài hơn. Quy tắc kiểm tra URL cần phân tích thành phần và đối chiếu host đúng chính sách.

5. Bộ ca kiểm thử tối thiểu

Tiêu đềTừ khóaKỳ vọng của matchesTitle
PHP basicsPHPtrue
Learn PHPPHPtrue
SQL basicsPHPfalse
PHP basicsphpfalse
PHP basicsChuỗi rỗngfalse

Thêm trường hợp từ khóa chỉ có dấu cách và tiêu đề rỗng. Các kỳ vọng trên mô tả đúng hợp đồng của hàm minh họa; nếu sản phẩm muốn tìm không phân biệt hoa thường, cần thay cả cách xử lý lẫn test.

Bài học quan trọng không chỉ là thêm một dấu bằng: hãy đọc đúng kiểu kết quả và chọn hàm theo câu hỏi cần trả lời. “Nằm ở đâu?” và “Có xuất hiện không?” là hai yêu cầu khác nhau.

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.