如何从[url]中获取所有内容,包括方括号和匹配组1和2

时间:2017-09-18 20:39:07

标签: ruby-on-rails regex bbcode

我有这个正则表达式

/\[url=(?:")?(.*?)(?:")?\](.*?)\[\/url\]/mi

和这些文本块

[url=/someurl?page=5#3467]First[/url][postquote=true]
[url=/another_url/who-is?page=4#3396] Second[/url]
Some text[url=/another_url/who-is?page=3][i]3[/i] Third [/url]

并且正则表达式非常适用于提取网址之间的网址和文字

匹配1

1.  /someurl?page=5#3467
2.  First

匹配2

1.  /another_url/who-is?page=4#3396
2.  Second

匹配3

1.  /another_url/who-is?page=3
2.  [i]3[/i] Third

当我使用上面的相同正则表达式尝试从此文本中提取网址时,会出现问题

This is some text [url=https://www.somesite.com/location/?opt[]=apples]Link Name[/url]

匹配1

1.  https://www.somesite.com/location/?opt[
2.  =apples]Link Name

注意第二场比赛中的=apples]。我需要的是匹配的第一场比赛,将其包含在网址中,如

  1. https://www.somesite.com/location/?opt[]=apples
  2. 链接名称
  3. 我已尝试对此正则表达式进行了许多修改,但到目前为止还没有任何帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

Ruby regex具有重复的命名捕获功能。使用此功能,您可以轻松地处理这两种情况&quote;和另一种情况)。您不必使用递归模式,因为我怀疑[]可以嵌套在url的查询部分中:

/\[url=(?:&quote;(?<url>[^&]*(?:&(?!quote;)[^&]*)*)&quote;|(?<url>[^\s\]\[]*(?:\[\][^\s\]\[]*)*))\](?<text>.*?)\[\/url\]/mi

网址在命名组 url 中,标记之间的内容位于命名组文本中。

以更易读的格式:

/

\[url=
(?:
    &quote; (?<url> [^&]* (?:&(?!quote;)[^&]*)* ) &quote;
  |
    (?<url> [^\s\]\[]* (?:\[\][^\s\]\[]*)* )
)
\]
(?<text>.*?)\[\/url\]

/mix