2017-04-04 67 views
0

我剛開始用ANTLR(Java的人),我需要一些幫助與解析.erb文件。 比方說,我有這樣的代碼:如何從.erb文件中的函數調用中提取函數名稱?

<html> 
<body> 
<div class ='title'> <h1>BLABLA</h1></div> 

<div class = 'log'> 
<%= form_tag('/home/login', :method => 'get') do %> 
    <tr> 
    <td><%= label_tag(:nick, 'Nickname:') %> 
     <%= text_field_tag(:nick) %> 
    </td> 
    <td><%= label_tag(:password, 'Password:') %> 
     <%= password_field_tag(:password) %> 
    </td> 
    </tr> 
    <%= submit_tag('Login') %> 
<% end %> 
</div> 

</body> 
</html> 

什麼是提取調用的函數名的最簡單的方法?我需要一個像這樣的列表:[「form_tag」,「label_tag」,「text_field_tag」,「password_field_tag」,「submit_tag」]

我真的不需要任何東西,所以採取HTML語法和適應ANTRL Github似乎有點矯枉過正。

謝謝你的閱讀/幫助。

+1

作爲快捷方式,您可以掃描所有的'<%= %>'和'<% %>'塊,並將它們解析爲紅寶石。 –

+0

@SergioTulentsev你的意思是基本上,採取所有標籤之間的字符串,把它們放在一起,並使用紅寶石antlr語法? – pokeahontas

+0

就是這樣的,是的。或者應用一些快速和骯髒的正則表達式,就像在@ mudasobwa的回答中一樣。 –

回答

1
code.scan(/(?<=<%=).*?(?=%>)/) 
    .map { |s| s[/(?<=\A=|\A).*?(?=\()/].to_s.strip } 
    .reject(&:empty?) # remove possible false positives 
#⇒ [ 
# [0] "form_tag", 
# [1] "label_tag", 
# [2] "text_field_tag", 
# [3] "label_tag", 
# [4] "password_field_tag", 
# [5] "submit_tag" 
# ] 

這裏有兩個正則表達式:

  • (?<=<%=).*?(?=%>)簡單地使用積極lookarounds
  • (?<=\A=|\A).*?(?=\()大多是相同的,但它看起來字符串的開頭之間(可能是(雙方向前看符號和lookbehinds。)後面跟着一個等號)和左括號。
+0

Plot twist:解析在java中完成:) –

+0

@SergioTulentsev Java採用PCRE :) – mudasobwa

+0

謝謝@mudasobwa。不幸的是,我沒有使用Ruby(忘記提及這一點)。我正在使用Java與ANTLR4來分析ERB文件/ Ruby – pokeahontas

相關問題