2012-04-14 28 views
3

即時通訊在網站上發表評論部分。 起初,我需要做的正則表達式查找任何URL和替換它與Url正則表達式爲preg_replace,但沒有匹配bbcode內的網址[url]

<a href="url"></a> 

所以,我發現了一個超正則表達式包圍找到註釋的所有URL的,我做的是返回所有功能網址爲html標記:

function addURLTags($string) { 
    $pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»「」‘’]))/"; 
    return preg_replace($pattern, '<a href="$1">$1</a>', $string); 
} 

一切都很好。但一個星期前,我的老闆告訴我,現在我必須將bbcode添加到評論部分。我就像「沒問題」......但他告訴我,我的函數addURLTags必須留下來。

所以任何像這樣的字符串:

http://www.google.com 
[url]http://www.google.com[/url] 
[url="http://www.google.com"]http://www.google.com[/url] 

必須更換相同的字符串:

<a href="http://www.google.com">http://www.google.com</a> 

所以我有一個小的PHP庫,替換所有的bbcode ocurrences到HTML代碼。

我想:「好吧,第一我應該沒有在beggining一[url]標籤的所有URL ocurrences其次我代替所有的UBB標籤!」

我試着在超級正則表達式的開始處添加一個否定斷言,如下所示:

/(?i)\ b((?![url])(?:https?:// | www \ d {0, 3)[。] | [a-z0-9 .-] + [。] [az] {2,4} /)(?:[^ \ s()<>] + |(([^ \ s )>] + |(([^ \ s()<>] +)))))+(::(([[\ s(012)<>] + |(([^ \ s >] +))))| [^ \ s`!()[] {};:'\「。,<>?«»」「'']))/

但沒有工作!

林有點新手正常表達式和我嘗試過的所有在線測試人員不能很好地處理如此長的正則表達式。我不知道還有什麼嘗試。

你有什麼建議嗎?你知道有沒有「url替換」,有沒有[url] bbcode標籤的PHP lybrary?

預先感謝您。

回答

1

您在這裏解決了兩個問題。因此,分開解決它們,不要將所有東西都解釋爲一個單一的正則表達式,這或多或少會使事情變得更復雜而不是更少。

分而治之:

首先使用設置高亮庫,可找到這些網址都是部位,使您可以創建一個文本流:

"normal text", "bbcode", "normal text", "bbcode" 

然後你擦上BB代碼庫僅在「bbcode」細分受衆羣上創建網址,而您的網址可點擊製作者僅適用於「普通文字」細分受衆羣。

在處理好所有的段後,將所有段連接成一個字符串。

瞧,問題解決了。

+0

我非常專注於按照自己的方式做事,因此我無法看清所有可能性。 我分割了註釋字符串並保存了所有bbcode的字符串。然後我將所有這些發送到bbcodelibrary。其餘的字符串與超正則表達式正常工作。 完美。非常感謝! – 2012-04-14 20:47:16

0

最好先解析[url] BBCodes,然後將任何裸露的URL鏈接到鏈接中。這很容易通過使用負面倒序來確保在URL之前沒有雙引號。這是有效的,因爲您應該已經將原始字符串中的引號轉換爲&quot;,因此URL之前的任何實際引號都必須作爲鏈接創建者的一部分放在那裏。