2012-06-24 29 views
27

Tôi có báo cáo kết quả HTML sauCách sử dụng preg_replace_callback?

[otsection]Wallpapers[/otsection] 
WALLPAPERS GO HERE 

[otsection]Videos[/otsection] 
VIDEOS GO HERE 

Những gì tôi đang cố gắng làm là thay thế [otsection] thẻ với một div html. Việc nắm bắt được tôi muốn tăng id của div từ 1-> 2-> 3, vv ..

Vì vậy, ví dụ, tuyên bố trên nên được dịch sang

<div class="otsection" id="1">Wallpapers</div> 
WALLPAPERS GO HERE 

<div class="otsection" id="2">Videos</div> 
VIDEOS GO HERE 

Theo như tôi có thể nghiên cứu, cách tốt nhất để làm điều này là thông qua một preg_replace_callback để tăng biến id giữa mỗi thay thế. Nhưng sau 1 giờ làm việc về điều này, tôi không thể làm cho nó hoạt động được.

Bất kỳ hỗ trợ nào với điều này sẽ được nhiều người đánh giá cao!

Trả lời

38

Sử dụng như sau:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    function($m) { 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    }, 
    $in); 

Đặc biệt, lưu ý rằng tôi đã sử dụng một biến static. Biến này tồn tại qua các cuộc gọi đến hàm, có nghĩa là nó sẽ được tăng lên mỗi lần hàm được gọi, điều này xảy ra cho mỗi kết quả phù hợp.

Ngoài ra, lưu ý rằng tôi đã thêm trước ots vào ID. ID phần tử không được bắt đầu bằng số.


Đối với PHP trước 5.3:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    create_function('$m',' 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    '), 
    $in); 
+0

Làm thế nào bạn có thể nhận được các '$ in' dân cư với chủ đề? –

+0

@SheikhHeera Điều đó đã có sẵn. Tôi thường sử dụng '$ in' và' $ out' để hiển thị dữ liệu vào và ra. –

+0

Câu trả lời hay, dù sao đi nữa. –

22

Note: Sau đây là dự định được một câu trả lời chung và không cố gắng để giải quyết vấn đề cụ thể của OP vì nó đã được addressed before .

preg_replace_callback() là gì?

Chức năng này được sử dụng để thực hiện tìm kiếm và thay thế cụm từ thông dụng. Nó tương tự như str_replace(), nhưng thay vì các chuỗi đơn giản, nó tìm kiếm mẫu regex do người dùng xác định và sau đó áp dụng hàm gọi lại trên các mục phù hợp. Hàm trả về chuỗi đã sửa đổi nếu tìm thấy các kết quả phù hợp, không thay đổi chuỗi khác.

Khi nào tôi nên sử dụng?

preg_replace_callback() rất giống với preg_replace() - khác biệt duy nhất là thay vì chỉ định chuỗi thay thế cho thông số thứ hai, bạn chỉ định hàm callback.

Sử dụng preg_replace() khi bạn muốn thực hiện tìm kiếm regex đơn giản và thay thế. Sử dụng preg_replace_callback() khi bạn muốn làm nhiều hơn là chỉ thay thế. Xem ví dụ bên dưới để biết cách hoạt động của nó.

Cách sử dụng?

Đây là ví dụ minh họa cách sử dụng hàm. Ở đây, chúng tôi đang cố gắng chuyển đổi chuỗi ngày từ định dạng YYYY-MM-DD thành DD-MM-YYYY.

// our date string 
$string = '2014-02-22'; 

// search pattern 
$pattern = '~(\d{4})-(\d{2})-(\d{2})~'; 

// the function call 
$result = preg_replace_callback($pattern, 'callback', $string); 

// the callback function 
function callback ($matches) { 
    print_r($matches); 
    return $matches[3].'-'.$matches[2].'-'.$matches[1]; 
} 

echo $result; 

Ở đây, mẫu biểu thức chính quy của chúng tôi tìm kiếm một chuỗi ngày của định dạng NNNN-NN-NN nơi N có thể là một chữ số khác nhau, 0-9 (\d là một đại diện viết tắt cho các lớp nhân vật [0-9]). Hàm gọi lại sẽ được gọi và truyền một mảng các phần tử phù hợp trong chuỗi đã cho.

Kết quả cuối cùng sẽ là:

22-02-2014 

Lưu ý: Ví dụ trên chỉ nhằm mục đích minh họa. Bạn không được sử dụng để phân tích cú pháp ngày. Sử dụng DateTime::createFromFormat()DateTime::format() để thay thế. This question có thêm chi tiết.