我有这个正则表达式
/\[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]
。我需要的是匹配的第一场比赛,将其包含在网址中,如
我已尝试对此正则表达式进行了许多修改,但到目前为止还没有任何帮助,我们将不胜感激。
答案 0 :(得分:1)
Ruby regex具有重复的命名捕获功能。使用此功能,您可以轻松地处理这两种情况("e;
和另一种情况)。您不必使用递归模式,因为我怀疑[]可以嵌套在url的查询部分中:
/\[url=(?:"e;(?<url>[^&]*(?:&(?!quote;)[^&]*)*)"e;|(?<url>[^\s\]\[]*(?:\[\][^\s\]\[]*)*))\](?<text>.*?)\[\/url\]/mi
网址在命名组 url 中,标记之间的内容位于命名组文本中。
以更易读的格式:
/
\[url=
(?:
"e; (?<url> [^&]* (?:&(?!quote;)[^&]*)* ) "e;
|
(?<url> [^\s\]\[]* (?:\[\][^\s\]\[]*)* )
)
\]
(?<text>.*?)\[\/url\]
/mix