DANH MỤC: PHP Regular Expression

Bài 7: Hàm preg_replace_callback trong PHP


Ở phần trước mình đã giới thiệu đến mọi người về hàm preg_replace() trong PHP rồi, nhưng ở một số trường hợp nâng cao thì hàm đó sẽ không thực hiện được. Chính vì thế PHP đã cung cấp cho chúng ta hàm preg_replace_callback() để xử lí so khớp và thay thế chuỗi nâng cao.

1, Hàm preg_replace_callback().

-Hàm preg_replace_callback() trong PHP cũng có tác dụng như hàm preg_replace() nhưng nó sẽ có khả năng thay thế nâng cao hơn.

Cú pháp:

preg_replace($pattern,'callback', $subject, $limit, $count);

Trong đó:

  • $pattern là chuỗi regex mà các bạn muốn tìm kiếm.
  • callback là hàm xử lý chuỗi thay thế.
  • $subject là chuỗi mà các bạn cần tìm kiếm và thay thế.
  • $limit là giới hạn số lần thay thế chuỗi mặc định là $limit = -1 là không giới hạn (tham số này có thể bỏ trống).
  • $count là số lần thay thế chuỗi khi sử dụng hàm, được sử dụng dưới dạng tham chiếu.(tham số này có thể bỏ trống).

2, Các ví dụ.

So khớp và thay thế đơn giản

VD1: Trong trường hợp chúng ta muốn thay thế chuỗi ngày tháng năm của ngày hiện tại lên 1 đơn vị (ngày +1, tháng +1, năm +1) bằng Regular Expression thì khi đó chúng ta sử dụng hàm preg_replace() như trước sẽ không làm được, mà phải sử dụng hàm preg_replace_callback().

<?php
//hàm xử lý ngày tháng năm tăng thêm một
function handleDate ($match)
{
    return ($match[1]+1).'/'.($match[2]+1).'/'.($match[3]+1);
}
//chuỗi regex
$pattern = '/([0-9]{2})-([0-9]{2})-([0-9]{4})/';
//Chuỗi cần replace
$subject = date('d-m-Y');
//replace
echo preg_replace_callback($pattern, 'handleDate', $subject);

-Ở ví dụ trên, như các bạn đã thấy thì biến truyền vào callback function là một mảng giá trị kết quả của việc so khớp chuỗi pattern và dựa vào đó chúng ta có thể lấy được giá trị của từng chuỗi khớp và xử lý chúng.

VD2: Cũng như ví dụ 1 nhưng callback function mình sẽ chuyển về dạng anonymous function.

<?php
//chuỗi regex
$pattern = '/([0-9]{2})-([0-9]{2})-([0-9]{4})/';
//Chuỗi cần replace
$subject = date('d-m-Y');
//replace
echo preg_replace_callback(
        $pattern,
        function ($match) {
            return ($match[1]+1).'/'.($match[2]+1).'/'.($match[3]+1);
        },
        $subject
    );

So khớp và thay thế chuỗi sử dụng đệ quy.

VD3: Chuyển đổi hết tất cả các BBcode tag về HTML tag.

<?php
$input = "[div] Toidicode.com [div] Học [/div] lập trình [/div] ";

function convertTag($input)
{

    $regex = '/\[div\](.+)\[\/div\]/';

    if (is_array($input)) {
        $input = '<div>'.$input[1].'</div>';
    }

    return preg_replace_callback($regex, 'convertTag', $input);
}

echo convertTag($input);

-Lưu ý: Đây là bài toán mình demo sử dụng đệ quy để xử lý thôi, còn trên thực tế dưới dạng này chúng ta không nên sử dụng đệ quy mà có thể pattern bình thường ví dụ như sau:

<?php
$input = "[div] Toidicode.com [div] Học [/div] lập trình [/div] ";
$regex = '/\[(.+?)\]/';

echo preg_replace_callback(
        $regex,
        function ($data) {
            return '<'. $data[1].'>';
        },
        $input
    );

3, Lời kết.

-Phần này mình chỉ tâp trung vào phân tích tham số callback còn các tham số khác giống hệt như hàm preg_replace() nhé!.

Nguồn: Toidicode.com

Thông tin tác giả

Thanh Tai (thanhtaivtt)

Thanh Tai (thanhtaivtt)

The best way to learn is to teach

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia