2017-09-18 67 views
0

內我有這樣的正則表達式如何抓住所有的內容,從[URL]包括括號和匹配組1和2

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

和正則表達式在提取URL和文本的URL之間

1場

1. /someurl?page=5#3467 
2. First 
012的偉大工程

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]。我需要的是匹配的第一場比賽,包括在URL中像

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

我已經嘗試了許多修改,此正則表達式,並沒有走那麼遠,任何幫助將不勝感激。

+1

你用什麼語言? –

+0

如果是RoR,請參閱[BBCode for Ruby on Rails](https://stackoverflow.com/questions/1506002/bbcode-for-ruby-on-rails)。 –

+0

是在軌道上紅寶石,我使用BBCode,但這個問題只是普通的正則表達式,雖然 – Trace

回答

1

Ruby正則表達式具有重複的命名捕獲功能。有了這個功能,您可以輕鬆處理這兩種情況(與&quote;和其他)。你不必因爲我懷疑[]可以嵌套在一個網址的查詢部分使用遞歸模式:

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

的URL被命名組網址和標籤之間的內容是在指定組文本

更可讀的格式:

/ 

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

/mix 
+0

這個效果不錯,但我不需要'text'和'url'我只需要1和2匹配就像我的例子 – Trace

+0

你能幫我刪除文本和網址,只有比賽1和2喜歡我的例子嗎? – Trace

相關問題