2013-05-26 44 views
6

Có thể để có được tất cả các biến được sử dụng trong một mẫu cành lá Ví dụ: Trên mẫuNhận tất cả các biến được sử dụng trong một cành mẫu tập tin

<!DOCTYPE html> 
<html> 
    <head> 
     <title>My Webpage</title> 
    </head> 
    <body> 
     <ul id="navigation"> 
     {% for item in navigation %} 
      <li><a href="{{ item.href }}">{{ item.caption }}</a></li> 
     {% endfor %} 
     </ul> 

     <h1>My Webpage</h1> 
     {{ a_variable }} 
    </body> 
</html> 

Bây giờ tôi cần phải nhận được tất cả các biến sử dụng ở trên là một mảng như

Array(1=>'navigation',2=>'a_variable') 

của nó tốt nhất nếu taxi nó được giải quyết bằng cành tự

+0

và tại sao 'mục' không phải là biến? – HamZa

+1

@HamZaDzCyberDeV Nó được sử dụng trong nội bộ mẫu, nhưng nó không phải là một tham số của mẫu. Bất cứ ai gọi 'render ($ op_template)' không quan tâm đến 'item'. – delnan

+0

@delnan Câu hỏi này được gắn thẻ là 'regex', regex không thể tìm/phát hiện những thứ như vậy một cách hợp lý khi nói bạn không thể viết mã gì đó phổ quát nếu bạn muốn tính đến các chi tiết đó. Nói về Twig, có vẻ như nó [không thể] (http://stackoverflow.com/q/12799094/), vì vậy chúng ta có thể phải làm điều đó với regex, nhưng chúng ta cần phải xác định "quy tắc" để trận đấu. – HamZa

Trả lời

20

Dawg Yo, tôi nghe bạn như cành vì vậy tôi đã viết một regex s o bạn có thể phân tích cú pháp trong khi bạn phân tích:

regex

\{\{(?!%)\s* # Starts with {{ not followed by % followed by 0 or more spaces 
     ((?:(?!\.)[^\s])*) # Match anything without a point or space in it 
\s*(?<!%)\}\} # Ends with 0 or more spaces not followed by % ending with }} 
| # Or 
\{%\s* # Starts with {% followed by 0 or more spaces 
     (?:\s(?!endfor)(\w+))+ # Match the last word which can not be endfor 
\s*%\} # Ends with 0 or more spaces followed by %} 
# Flags: i: case insensitive matching | x: Turn on free-spacing mode to ignore whitespace between regex tokens, and allow # comments. 

PHP

$string = '<!DOCTYPE html> 
<html> 
    <head> 
     <title>My Webpage</title> 
    </head> 
    <body> 
     <ul id="navigation"> 
     {% for item in navigation %} 
      <li><a href="{{ item.href }}">{{ item.caption }}</a></li> 
     {% endfor %} 
     </ul> 

     <h1>My Webpage</h1> 
     {{ a_variable }} 
    </body> 
</html>'; 

preg_match_all('/\{\{(?!%)\s*((?:(?!\.)[^\s])*)\s*(?<!%)\}\}|\{%\s*(?:\s(?!endfor)(\w+))+\s*%\}/i', $string, $m); 
$m = array_map('array_filter', $m); // Remove empty values 
array_shift($m); // Remove first index [0] 
print_r($m); // Print results 

Regex online demoPHP online demo

Lưu ý: Đây chỉ là một POC và không bao giờ có nghĩa là để được sử dụng trên sản xuất.

+6

Tôi ước tôi có thể upvote hai lần cho cụm từ đầu tiên) – zerkms

+3

+1 chỉ cho cụm từ, lol –

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