所以我正在構建一個小型CMS,並且我想避免在內容編輯器中允許使用HTML。出於這個原因,我想檢測文本中的原始URL以及支持類似BB的標籤,以獲得更好的定製。URL檢測和BB風格標籤(正則表達式,前瞻性問題)
www.example.com
[link http://www.example.com]Click me[/link]
不幸的是,我是相當新的正則表達式,我似乎無法得到這個工作。我在字符串上運行兩個正則表達式:第一個檢測原始URL,第二個BB類URL。後者似乎工作得很好,第一個干擾,然後轉換包裹在標籤中的URL。
我從一段代碼開始,找到here並做了一些補充。
這是對非標記網址的代碼:
/* don't match URLs preceeded by '[link ' */
(?<!\[link\s)
(
/* match all combinations of protocol and www. */
(\bhttps?://www\.|\bhttps?://|(?<!//)\bwww\.)
/* match URL (no changes made here) */
([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
/* but don't match if followed by [/link] - THIS DOESN'T WORK */
(?!\[/link\])
)
負向後看前www.
是那裏,因爲/
不是一個字符,而沒有它像
[link http://www.example.com]example[/link]
仍然會在http://
後匹配。
上述正則表達式產生以下的比賽(與http://gskinner.com/RegExr/測試,比賽都在大膽我不得不http://
後添加空格,因爲我不能發佈更多的網址。):
WWW .example.com的
HTTP:// www.example.com
HTTP:// example.com
[鏈接http://www.example.com]no問題1 [/鏈接]
[鏈接www.example.com]沒問題2 [/鏈接]
[鏈接http://www.example.com]http://www.example.com[/link]
我試着走動負前瞻並用括號(非常漫無目的地)玩,沒有成功。
爲了完整起見,這裏的標記匹配的正則表達式(這似乎工作):
(?:\[link\s)(\bhttps?://|\bwww\.|\bhttps?://www\.)([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))\](.*)(?:\[/link\])
我敢肯定有人可以立即發現錯誤。
非常感謝!
'(?!\ [/ link \])'lookahead將失敗,因爲PCRE會連續縮短前一個匹配的成功。您可能需要使URL匹配超級貪婪。嘗試'(?> ...)'使其成爲原子。 – mario 2013-02-21 15:15:16
你能再詳細一點嗎?我試圖讓各個小組成爲原子,但沒有成功(我不確定我是否完全理解原子組)。 – psalz 2013-02-22 11:42:46