2017-04-04 45 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

相关问题