如何从.erb文件中的函数调用中提取函数名称?

时间:2017-04-04 10:12:20

标签: java ruby-on-rails ruby antlr erb

我刚刚开始使用ANTLR(使用Java),我需要一些解析.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 :(得分: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).*?(?=\()大致相同,但它看起来在字符串的开头(可能后跟一个等号)和左括号之间。