2013-11-21 13 views
0

我有以下代碼將鏈接轉換爲字符串中的超鏈接。PHP REGEX將鏈接轉換爲字符串中的超鏈接 - 刪除上一期

$text_block = preg_replace('$(\s|^)(https?://[a-z0-9_./?=&-]+)(?![^<>]*>)$i', ' <a href="$2" target="_blank">$2</a> ',$text_block); 

然而,如果該鏈接爲一個時期的結束,像「做http://google.com搜索。」,正則表達式中包含鏈接的時期。我如何改變上面的正則表達式來尋找並且不包含如果存在的時期?

編輯:澄清 - $text_block是一個可能包含許多鏈接的大塊文本。正則表達式需要解析文本塊並找到並轉換所有找到的鏈接。

編輯2:正如在評論中指出的,我想你必須考慮像「.co.uk」這樣的域名。所以我想它必須尋找並刪除空白後面的最後時期,如果存在的話......變得棘手。有任何想法嗎?

+0

你怎麼確定何時週期並且不需要? –

+0

@MikeBrant:可能是在最後一個人時。 –

+0

啊好點 - 例如沒有考慮過.co.uk。 – Chris

回答

1

不是特別優雅,但純粹的正則表達式的解決方案是:

$(\s|^)(https?://[a-z0-9_./?=&-]+[a-z0-9_/?=&-])(?![^<>]*>)$i 

就確保了最後一個字符是任何有效的字符,除了.

PHP

$text_block = preg_replace('$(\s|^)(https?://[a-z0-9_./?=&-]+[a-z0-9_/?=&-])(?![^<>]*>)$i', ' <a href="$2" target="_blank">$2</a> ',$text_block); 

Working on RegExr

+0

OGHaza - 完美的作品。非常感謝。我能否以相同的確切正則表達式標準來解決問題,但要查找並替換電子郵件鏈接?或者我應該開始一個新的問題。我可能應該把它包括在我原來的問題 – Chris

+0

@Chris剛剛修改你的正則表達式:'$(\ s | ^)([a-z0-9 _.-] + @ [a-z0-9 _.-] +您將幾乎肯定需要修改每個部分中允許的字符。[a-z0-9 _-])(?![^ <>] *>)$ i' [RegExr](http://regexr.com?37a99) ,我只是把它們留爲'[a-z0-9 _.-]' – OGHaza

+1

很好用!你是一個拯救生命的人;)非常感謝你的時間。我很感激! – Chris

0

試試這個:

$output = rtrim($string, '.'); 
+0

'TrimEnd()'在PHP中不存在。 –

+0

@CasimiretHippolyte哇,我看到了這個問題,只是在思想上認爲c#... – LuFaMa