使用Ruby从BBcode中提取链接
哪个是从BBcode[code]…[/code]节提取链接的简单方法/正则表达式?所有链接都以http://开头,以\n或[/code]标记结尾,结尾可能是一些空格或其他空白字符 一个[代码]部分可以包含多个链接/代码标签:使用Ruby从BBcode中提取链接,ruby,regex,hyperlink,bbcode,Ruby,Regex,Hyperlink,Bbcode,哪个是从BBcode[code]…[/code]节提取链接的简单方法/正则表达式?所有链接都以http://开头,以\n或[/code]标记结尾,结尾可能是一些空格或其他空白字符 一个[代码]部分可以包含多个链接/代码标签: [code]http://example1.com http://example2.com http://example3.com [code] 有时也会出现多个连续的[代码]部分: [code]http://example4.com http://example5.co
[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]
我想在一个简单的扁平数组中获取上面定义的这一节中的所有链接,但我无法为扫描方法求解正确的正则表达式。试试这个:
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"]
您可以尝试以下方法:
测试字符串:
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
bbcode=
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