2013-07-24 79 views
2

我想過濾一個描述字符串中的標籤,並希望將它們製作成錨標籤。我無法返回標籤的值。如何使用gsub搜索並使用正則表達式進行替換?

我輸入的是:

a = "this is a sample #tag and the string is having a #second tag too" 

我的輸出應該是:

a = "this is a sample <a href="/tags/tag">#tag</a> and the string is having a <a href="/tags/second">#second</a> tag too" 

到目前爲止,我能夠做一些輕微的東西,但我不能才達到最終輸出。這種模式:

a.gsub(/#\S+/i, "<a href='/tags/\0'>\0</a>") 

回報:

"this is a sample <a href='/tags/\u0000'>\u0000</a> and the string is having a <a href='/tags/\u0000'>\u0000</a> tag too" 

什麼我需要做不同?

+0

您可以使用'nokogiri'來幫助您。 –

+1

@Priti只是爲了這個小東西,我不想在我的應用程序中添加一個gem –

+0

如果這是HTML解析,那麼Nokogiri會有用。這是HTML代,它爲此目的顯着降低了Nokogiri的價值。 –

回答

5

你可以這樣說:

a.gsub(/#(\S+)/, '<a href="/tags/\1">\0</a>') 

之所以你更換不起作用的是,你必須使用雙逃逸當你之間雙引號:

a.gsub(/#(\S+)/, "<a href='/tags/\\1'>\\0</a>") 

請注意,/i修飾符在這裏不需要。

+0

+1指出不需要'/ i'。原因是''#''沒有小寫值,而且它後面的所有內容都與'\ S +'匹配。 –

3

你需要給gsub塊,如果你想要做的事與正則表達式匹配:

a.gsub(/#(\S+)/i) { "<a href='/tags/#{$1}'>##{$1}</a>" } 

$1是一個全局變量,紅寶石與匹配的字符串中第一個捕獲塊,自動填充。

+0

正如其他答案所證明的那樣,可以使用'1'來引用捕獲,而不將塊傳遞給'gsub'。所以,當答案有效時,斷言是不正確的。 –

1

試試這個:

a.gsub(/(?<a>#\w+)/, '<a href="/tags/\k<a>">\k<a></a>') 
+0

返回''這是一個樣本#tag,並且該字符串也有一個#second標籤「'('href'不是在問題中指定的那樣) – tessi

+0

我不認爲這個答案應該因爲那個小錯誤而得到反對票。 – Doydle

+0

我同意,這是使用命名捕獲組的關鍵點的原則。 –

相關問題