2013-07-18 3 views
0

Что такое простой метод/регулярное выражение для извлечения ссылок из раздела BBcode [code] ... [/ code]? Все ссылки начинаются с 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 

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, это работает. – Konstantin

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