2014-02-14 6 views
-2

У меня есть строка:Сформировать строку, содержащую спасся интерполяции

<ul> 
    <li><a href="/<%= @home %>/">welcome</a></li> 
</ul> 

Я использую Nokogiri, чтобы захватить href свойства всех его a тегов и построить массив хэшей. Я ожидаю:

[{ 
    :href => "/#{ @home }/", 
    :title => "welcome" 
}] 

Я попробовал этот скрипт:

doc = Nokogiri::HTML(open(file)) 
menu = [] 

doc.css('a').each do |item| 
    menu.push({ 
    :href => item[:href].gsub(/<%=(.*)%-?>/, "\#{\\1}"), 
    :title => item.text 
    }) 
end 

Результирующая строка автоматически прибежит; обратите внимание на дополнительную обратную косую черту перед символьным символом:

[{ 
    :href => "/\#{ @home }/", 
    :title => "welcome" 
}] 

Я не могу понять, почему. Есть идеи?

+2

«и я не могу понять, почему» - потому что вы сами вставить экранированный знак хэша. –

+0

Это строка с двойными кавычками, не выходя из нее, она будет интерполировать в gsub. Пробовал с unescaped # в одной кавычки. Тот же результат. –

+0

@AndreiSerdeliuc, Try 'puts menu [0] [: href]' – falsetru

ответ

1

Вы не '\' в строке, он добавляется в inspect: если вы puts строка вы поймете это:

asd = '<%= asd %>'.gsub(/<%=(.*)%-?>/, "\#{\\1}") #=> "\#{ asd }" 

p asd #=> "\#{ asd }" <- this is `asd.inspect`, which is returned by `p` 
"\#{ asd }" <- this is `asd.inspect`, which is printed by `p` 

puts asd #=> nil <- this is `nil`, which is returned by `puts` 
#{ asd } <- this is `asd.to_s`, and it is the actual string 
+2

Вы имеете в виду '' \ ''? – falsetru

+0

Хорошая точка. Это не в строке. Я использую menu.pretty_inspect, чтобы захватить код ruby, чтобы вставить в результирующий файл, и pretty_inspect ускользает от вывода. –

+0

Да @falsetru, спасибо – mdesantis

Смежные вопросы