【问题标题】:Extract links from BBcode with Ruby使用 Ruby 从 BBcode 中提取链接
【发布时间】:2013-07-18 00:19:47
【问题描述】:

从 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]

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

【问题讨论】:

    标签: ruby regex hyperlink bbcode


    【解决方案1】:

    试试这个:

    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"]
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      测试字符串:

      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
      

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 2012-04-01
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多