【问题标题】:How do I grab all the content from within [url] including square brackets and match group 1 and 2如何从 [url] 中获取所有内容,包括方括号和匹配组 1 和 2
【发布时间】:2017-09-18 20:39:07
【问题描述】:

我有这个正则表达式

/\[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

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

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]。我需要的是匹配的第一个匹配项,以将其包含在 url 中,例如

  1. https://www.somesite.com/location/?opt[]=apples
  2. 链接名称

我已经尝试了很多修改这个正则表达式,但到目前为止还没有,任何帮助将不胜感激。

【问题讨论】:

  • 你使用什么语言?
  • 如果是RoR,见BBCode for Ruby on Rails
  • 是的 ruby​​ on rails 我正在使用 BBCode 但这个问题只是普通的正则表达式
  • @WiktorStribiżew - 太好了,但我需要匹配 1 和 2,而你有 1 2 和 3。你能删除一个吗?

标签: ruby-on-rails regex bbcode


【解决方案1】:

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

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

url在命名组url中,标签之间的内容在命名组text中。

以更易读的格式:

/

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

/mix

【讨论】:

  • 这很好用,但我不需要 texturl 我只需要像我的例子一样匹配的 1 和 2
  • 你能帮我删除文本和网址,像我的例子一样只有匹配 1 和 2 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
相关资源
最近更新 更多