2010-05-26 24 views
2

基本上,我有一些關鍵字需要挑選並動態分配鏈接。將<a href>附加到關鍵字欄中

我該如何去做這件事?

比方說,我有這樣的事情;

<p>ruby, rails, php, python, django and sinatra</p> 

我想分配鏈接到像ruby和python這樣的關鍵字,所以最終的結果應該看起來像這樣;

<p><a href="http://www.ruby-lang.org">ruby</a>, rails, php, <a href="http://www.python.org">python</a>, django and sinatra</p> 

任何幫助或建議將不勝感激!

+4

你想在後端或前端的分配發生的呢?因爲這將是一個不同的故事。 – 2010-05-26 11:05:52

+2

@Josh Stodola ...不是一個真正有用的評論。事實上,如果這是一個真正的答案,它會被降低。 – DJTripleThreat 2010-05-26 14:10:13

+2

@Josh Stodola:他確實指定*動態*。 – 2010-05-26 14:14:54

回答

4

一個這樣做的方式,假設你只想鏈接全字:

html = "<p>ruby, rails, php, python, django and sinatra</p>" 

word_links = { "ruby" => "http://www.ruby-lang.org", 
       "python" => "http://www.python.org" } 

html.gsub(/\w+/) do |word| 
    word_links[word] ? "<a href=\"#{word_links[word]}\">#{word}</a>" : word 
end 

如果您正在運行的文字是相當大的,但你要鏈接的單詞列表是非常小的,這可以通過只匹配單詞做替換優化的一點:

html.gsub(/\b(#{word_links.keys.join('|')})\b/, 
      "<a href=\"#{word_links[$1]}\">#{$1}</a>") 

只要確保你沒有任何可以出現在開始標記內的關鍵字(例如在屬性值內部,這可能會徹底破壞這個解決方案)。對於一個真正強大的解決方案,您將不得不使用正確的HTML解析器,而只需替換內容文本。

+0

+1用於處理空白。我可以發誓,有一個這樣做的寶石,但我找不到它! – DJTripleThreat 2010-05-26 14:09:06

+0

謝謝!我使用這個實現,但使用each_pair而不是gsub。 – crayfish 2010-05-26 17:51:36

0

只需使用文本替換?將「ruby」替換爲「ruby </a>」,然後完成。 請參閱javascript參考中的String.replace。

+0

謝謝,但我想在後端做到這一點。 – crayfish 2010-05-26 17:45:25

3

如果你想這樣做在服務器端前的內容呈現給瀏覽器,那麼你可以不喜歡它

​​
+3

這將插入關鍵字出現在更長的單詞中的鏈接,這可能會也可能不需要。假設其中一個關鍵字是「C」,例如。 – 2010-05-26 13:36:15

+0

@DJTripleThreat:那麼你不會在字符串的開始或結尾,或與相鄰的標點符號和換行符相遇。使用\ b檢查正則表達式中的單詞邊界。 – 2010-05-26 22:00:42

+0

@DJTripleThread @Lars Haugseth感謝您指出了這一點。我現在修改了我的答案,以包含單詞邊界。 – nas 2010-05-27 03:46:06

0

如果你想成爲特別的花哨,我想以後你可以使用過濾:

class MyController < ApplicationController 
    after_filter :link_stuff 

    protected 

    def link_stuff 
    # You'd want to do this more carefully, so as to only get "ruby"s in text, 
    # not in tags etc. 
    response.body.gsub(/ruby/, "<a href = 'http://www.ruby-lang.org'>ruby</a>") 
    end 
end 
0

你可以這樣做

首先得到的值作爲一個數組(或列表) 例:紅寶石 PHP 蟒蛇等。

發送此陣列的輔助

DEF link_builder(ARR) html_string = 「」

爲元件在ARR

check whether your word needs a wrapper. you might want to do a table check 

if warpper_needed? 

    html_string = html_string + <a href='link'>elment</a> 
else 
    html_string = html_string + <p>element</p> 
end 

html_string

希望你有這個想法,(這可能無法正常工作,因爲它是)

歡呼聲, sameera