2013-07-18 3 views
0

Quelle est une méthode simple/expression régulière pour extraire les liens d'une section BBcode [code] ... [/ code]? Tous les liens commencent par http: // et se terminent par \ n OU une balise [/ code], peut-être un espace ou d'autres caractères blancs à la fin.Extraire des liens de BBcode avec Ruby

un [code] section peut contenir balise liens multiples/code: sections peuvent également se produire

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

et parfois plusieurs consécutifs [code]:

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

Je voudrais obtenir toutes les liens à partir d'une telle section définie ci-dessus dans un tableau simple aplati, mais je suis incapable de résoudre l'expression régulière droite pour la méthode de balayage.

Répondre

0

Essayez celui-ci:

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?) 

Sortie:

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

Aucun d'entre eux ne fonctionne. – Konstantin

+0

Aucun de ces produits? –

0

Vous pouvez essayer ceci:

chaîne de test:

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 

Regex:

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, cela fonctionne. – Konstantin