2013-07-18 66 views
0

這是一個簡單的方法/正則表達式從BBcode中提取鏈接[code] ... [/ code] section?所有鏈接以http://開頭,最後以\ n或一個[/ code]標籤結尾,也許最後有一些空格或其他空格字符。從BBcode中提取鏈接與Ruby

一個[代碼]部分可以包含多個鏈接/碼標籤:

[code]http://example1.com 
http://example2.com 
http://example3.com 
[code] 

,有時甚至連續多個[代碼]部分也可能發生:

[code]http://example4.com 
http://example5.com [/code] 
[code]http://example6.com[/code] 
[code] 
http://example7.com 
http://example8.com[/code] 

我想獲得的所有鏈接從一個簡單的扁平數組中定義上面的這樣的部分,但我無法解決掃描方法的正確的正則表達式。

回答

0

試試這個:

data = '[code]http://example4.com 
http://example5.com [/code] 
[code]http://example6.com[/code] 
[code] 
http://example7.com 
http://example8.com[/code]' 

p data.split(/\[\/*code\]/) 
     .flat_map{|el| el.split(/\s+/)} 
     .reject(&:empty?) 

輸出:

#=> ["http://example4.com", "http://example5.com", "http://example6.com", "http://example7.com", "http://example8.com"] 
+0

沒有一個可行。 – Konstantin

+0

沒有「他們」? –

0

你可以試試這個:

測試字符串:

bbcode = <<EOF 
[code] xxxxx 

xxxxx 
http://example1.com 
http://example2.com 
http://notme.org  abcd 
http://example3.com 
[/code] 

[code]xxxx[/code] 

http://notme.com 

[code]http://example4.com 
http://example5.com[/code] 
[code]http://example6.com [/code] 
[code] 
http://example7.com 
http://example8.com[/code] 
EOF 

正則表達式:

pattern = Regexp.new(' 
# Definitions 
(?<url> http://[^\[\s]++     ){0} 
(?<open> \[code\]       ){0} 
(?<close> \[/code\]       ){0} 
(?<ws>  [^\S\n]++       ){0} 
(?<other> \g<ws>?+ 
      (?> (?!\g<url>) | \g<url> \g<ws>) 
      [^\[\n]++       ){0} 
(?<end> \g<ws>?+ (?> \n | \g<close>)  ){0} 

# Pattern 
(?> \g<open> | \G (?<! \g<close>)) 
(?> \g<other>?+ \n++)* \g<ws>?+ \g<url> \g<end> ', 
Regexp::EXTENDED | Regexp::IGNORECASE) 


bbcode.scan(pattern) do |link, tag| 
    puts "#{link}\n" 
end 
+0

Thx,這個工程。 – Konstantin