0

哪个是从 BBcode [code]...[/code] 部分中提取链接的简单方法/正则表达式?所有链接都以 http:// 开头并以 \n 或 [/code] 标记结尾,最后可能是一些空格或其他空白字符。

一个 [code] 部分可以包含多个链接/代码标签:

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

有时也会出现多个连续的 [code] 部分:

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

我想从一个简单的扁平数组中获取上面定义的这样一个部分的所有链接,但我无法为扫描方法解决正确的正则表达式。

4

2 回答 2

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
于 2013-07-18T06:30:38.490 回答
0

Try this one:

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

Output:

#=> ["http://example4.com", "http://example5.com", "http://example6.com", "http://example7.com", "http://example8.com"]
于 2013-07-18T06:08:37.800 回答