2017-07-30 9 views
1

私はApache2サーバー側のインクルードファイルを持っています。これは、(実際のデータが編集さ)のようになります。ファイルから変数を読み込んで置換する

<!--#set var="FIRST_VAR" value="HI" --> 
<!--#set var="SECOND_VAR" value"THERE" --> 
<!--#set var="FINAL_VAR" value="HEY/${FIRST_VAR}/${SECOND_VAR}/${FINAL_VAR}" --> 

私は何をしたいのは、名前の変数を正規表現マッチを行い、その後、おそらく、ハッシュを使用して、ネストされた変数を構築することです。例:

@SSI["FIRST_VAR"] = "HI" 
@SSI["SECOND_VAR"] = "THERE" 
@SSI["FINAL_VAR"] = "HEY/HI/THERE" 

私はこれを正しく行う方法がありません。あなたは、ファイルのテキストと同じ文字列を持っている場合は

答えて

2

は、あなたが文字列にファイルを読んでいると行に文字列を分離してから空白を取り除きます各行の端。

arr =<<_.lines.map(&:strip) 
<!--#set var="V1" value="HI" --> 
<!--#set var="V2" value="THERE" --> 
<!--#set var="FV" value="HEY/${V1}/${V2}" --> 
_ 
    #=> ["<!--#set var=\"V1\" value=\"HI\" -->", 
    # "<!--#set var=\"V2\" value=\"THERE\" -->", 
    # "<!--#set var=\"FV\" value=\"HEY/${V1}/${V2}\" -->"] 

次の正規表現を使用します。

r1 =/
    (?<=\svar=\") # match ' var="' in a positive lookbehind 
    .+?    # match one or more characters lazily 
    (?=\")   # match '"' in a positive lookahead 
    /x    # free-spacing regex definition mode 

r2 =/
    (?<=\svalue=\") # match ' value"' in a positive lookbehind 
    .+?    # match one or more characters lazily 
    (?=\")   # match '"' in a positive lookahead 
    /x    # free-spacing regex definition mode 

r3 =/
    \/\$\{   # match '/${' 
    \w+    # match one or more word characters 
    \}    # match '}' 
    /x    # free-spacing regex definition mode 

r4 =/
    (?<=\/\$\{)  # match '/${' in a positive lookbehind 
    .+?    # match any number of character, lazily 
    (?=\})   # match `}` in a positive lookahead 
    /x    # free-spacing regex definition mode 

次のようにして、希望の戻り値を計算できます。

g = arr.each_with_object({}) do |s,h| 
    var = s[r1].strip 
    value = s[r2].strip 
    h["\/\$\{#{var}\}"] = value.gsub(r3) { |s| h.key?(s) ? "/#{h[s]}" : "" } 
end 
    #=> {"/${V1}"=>"HI", "/${V2}"=>"THERE", "/${FV}"=>"HEY/HI/THERE"} 

最後に、キーを変更します。

g.each_with_object({}) { |(k,v),h| h[k[r4]] = v } 
    #=> {"V1"=>"HI", "V2"=>"THERE", "FV"=>"HEY/HI/THERE"} 

上記の2つの表現はもちろん連鎖することができます。実際、それは1行で書くことができますが、私はそれをお勧めしません。

2

txt = <<-TXT 
<!--#set var="FIRST_VAR" value="HI" --> 
<!--#set var="SECOND_VAR" value="THERE" --> 
<!--#set var="FINAL_VAR" value="HEY/${FIRST_VAR}/${SECOND_VAR}/${FINAL_VAR}" --> 
TXT 

は、その後、あなたが正規表現を構築することができます(また、私は、2行目にvalue=を追加しました注意してください)引用はエスケープされ、一致基がdefinれる以外の正規表現は、基本的にファイルに含まれているものと同じ形式である

result = txt.scan /<!--#set var=\"(.+)\" value=\"(.+)\" -->/ 
# => 
# [["FIRST_VAR", "HI"], 
# ["SECOND_VAR", "THERE"], 
# ["FINAL_VAR", "HEY/${FIRST_VAR}/${SECOND_VAR}/${FINAL_VAR}"] 
# ] 

:そう様(.+)を使用して編集します。

正規表現は、おそらくより良いですが、あなたはまた、splitを使用して、より強引なスタイルのアプローチを取ることができる:

txt.split("\n").map do |line| 
    var, rest = line.split("var=\"")[1].split("\" value=\"") 
    value = rest.split("\"")[0] 
    [var, value] 
end 
+0

これはどのくらい面白いですか。少なくとも私の経験の浅い心の中で。私の方法はきれいではありませんでしたが、私はそこに着くことができました。しかし、埋め込み変数リファレンスをどのように置き換えるかはまだ分かりません。 FIRST_VARなどをクリーンな方法で使用します。任意のアイデアやヒントがありますか? – farhany

関連する問題