2009-07-29 34 views
6

Tôi đang cố tạo các thẻ tùy chỉnh đơn giản để cho phép các mẫu tùy chỉnh trên ứng dụng của mình. Nhưng tôi không thể tìm ra cách phân tích cú pháp và thay thế các thẻ.Phân tích các thẻ tùy chỉnh bằng PHP

(ví dụ)

<div class="blog"> 
<module display="posts" limit="10" show="excerpt" /> 
</div> 
<div class="sidebar"> 
<module display="users" limit="5" /> 
<module display="comment" limit="10" /> 
</div> 

cho mỗi thẻ mô-đun được tìm thấy, tôi muốn chạy các chức năng tạo ra mô-đun với các thông số (được liệt kê trong thẻ như là thuộc tính). Và thay thế thẻ mô-đun, với một đoạn HTML thực tế được trả về từ hàm.

Trả lời

9

Bạn có thể sử dụng cụm từ thông dụng để khớp với thẻ tùy chỉnh của mình.

$html // Your html 

preg_match_all('/<module\s*([^>]*)\s*\/?>/', $html, $customTags, PREG_SET_ORDER); 

foreach ($customTags as $customTag) { 
$originalTag=$customTag[0]; 
$rawAttributes=$customTag[1]; 

preg_match_all('/([^=\s]+)="([^"]+)"/', $rawAttributes, $attributes, PREG_SET_ORDER); 

$formatedAttributes=array(); 

foreach ($attributes as $attribute) { 
    $name=$attribute[1]; 
    $value=$attribute[2]; 

    $formatedAttributes[$name]=$value; 
} 

$html=str_replace($originalTag, yourFunction($formatedAttributes), $html); 
} 

Nếu bạn muốn sử dụng XML aproach, hãy liên hệ với tôi và tôi sẽ hướng dẫn bạn cách thực hiện điều đó.

+3

Nghiêm túc? Tại sao lại sử dụng regex khi nó chậm hơn rất nhiều so với các hàm XML dựng sẵn. – icco

+2

Nó không phải là chậm hơn thực sự. –

3

http://us3.php.net/manual/en/function.preg-replace-callback.php

Đồng nghiệp của tôi đã làm việc với thẻ phân tích cú pháp ... tùy thuộc vào mức độ phức tạp mà bạn muốn đạt được, bạn có thể muốn sử dụng regex. Sử dụng regex để tìm các thẻ, và sau đó bạn có thể chia các chuỗi với các chức năng thao tác chuỗi theo sở thích của riêng bạn. Tính năng gọi lại trên preg_replace_callback sẽ cho phép bạn thay thế thẻ bằng bất kỳ dữ liệu html nào bạn muốn nó đại diện. Chúc mừng!

chỉnh sửa: (< mô-đun + ([^ =] + = "[^"] * ")/>?????) này phải phù hợp với chức năng mô-đun ... loại bỏ các không gian giữa < và mô-đun (SO phân tích cú pháp sai) Trong hàm tùy chỉnh của bạn, hãy so khớp các tham số riêng lẻ trong thẻ, sử dụng regex như: ([^ =] +? = "[^"]? ")

3

Bạn có thể phân tích cú pháp tệp của mình bằng cách sử dụng simplexml và truy lục các thuộc tính sau khi lặp qua và tìm các yếu tố của bạn. Đây là một example.

+0

Nếu bạn viết mã để giải thích chính xác cách thực hiện thì câu trả lời này có thể đã được chấp nhận. – icco

2

Natso đề xuất preg_replace_callback là lựa chọn tuyệt vời cho loại giải pháp này.

Một tùy chọn khác là đọc mẫu/tệp dưới dạng XML, nếu bạn đang mong đợi xác thực đánh dấu xml, với XmlReader và hành động trên các nút thích hợp. Như một gợi ý khác, bạn có thể muốn sử dụng Xml Namespaces cho các thẻ tùy chỉnh của bạn vì điều này sẽ đảm bảo rằng bạn không có xung đột.

Các vấn đề liên quan