2011-11-16 75 views
2

我目前有一些問題與檢測網址,使他們可點擊。 到目前爲止,它一直運行良好,可能是因爲我們總是用真實的URL進行測試,但現在網站是活的,我們遇到了一些問題。網址檢測問題

這是我們使用之前

$content = preg_replace('!(((f|ht)tp://)[-a-zA-Zа-яА-Я()[email protected]:%_+.~#?&;//=]+)!i', '<a href="$1" target="_blank">$1</a>', $content); 
$content = eregi_replace('([[:space:]()[{}])(www.[[email protected]:%_\+.~#?&//=]+)', '\\1<a href="\\2" target="_blank">\\2</a>', $content); 

它是做正常的URL一項偉大的工作,以檢測它們的代碼,但有的URL給人的問題:

- hk.linkedin.com 
- www.test.com 
- test.com 

還要注意,某些URL在他們之前沒有http。

對於正則表達式,我真的不太好,所以如果有人能幫我弄明白這一點,我將非常感激。

+1

你爲什麼不告訴你一點你想達到什麼,以及你面臨的「問題」是什麼? –

+0

我總是從任何通過正則表達式發送的URL中刪除'http://'。因爲它可以是精確的或不存在的,所以在通過模式運行之前,可以使用簡單的'str_replace('http://','',$ url)'來完成。注意:這將從URL中傳遞的任何urlencoded()字符串中移除「http://」。 –

+0

謝謝,刪除http已經解決了一些問題。 –

回答

0

你到底想要什麼。在這個例子中,我可以看到明顯缺乏對正則表達式的理解...但是,然後,根據Google Code Search,我看到幾個代碼中使用的確切代碼。但是,這些被做在文本中發現的中間網址(並不總是看起來像URL是URL,但如果它包含http://www這是肯定的URL。

並非一切都需要使用正則表達式來僅完成。這些都是

正則表達式中的問題之一是它們沒有結果條件,可以使用多個正則表達式,但有可能會錯誤地執行某些操作(如影響以前的正則表達式做了什麼),看看這個,它分配了額外的功能(你可以使用e修飾符,但它可能使代碼不可讀)

<?php 
$content = preg_replace_callback('{\b(?:(https?|ftp)://)?(\S+[.]\S+)\b}i', 
           'addHTTP', $content); 
function addHTTP($matches) { 
    if(empty($matches[1])) { 
     return '<a href="http://' . $matches[2] . '">http://' . $matches[2] . '</a>'; 
    } 
    else { 
     return '<a href="' . $matches[2] . '">' . $matches[2] . '</a>'; 
    } 
} 

或兩個正則表達式(更難理解)...

$content = preg_replace('{\b(?:(?:https?|ftp)://)\S+[.]\S+\b}i', 
         '<a href="$0">$0</a>', $content); 
$content = preg_replace('{\b(?<!["\'=><.])[-a-zA-Zа-яА-Яа-яА-Я()[email protected]:%_+.~#?&;//=]+[.][-a-zA-Zа-яА-Яа-яА-Я()[email protected]:%_+.~#?&;//=]+(?!["\'=><.])\b}i', 
         '<a href="http://$0">http://$0</a>', $content); 

此外,你應該避免使用target=""。用戶不希望單擊鏈接時會出現新窗口。用戶點擊這個鏈接後,他可能會想知道爲什麼「左轉」按鈕不起作用(提示:新窗口導致它消失)。如果有人真的想在新窗口打開鏈接,他會自己做(不難......)。

請注意,通常這樣的東西是與這樣的其他助手鍊接。例如,Stack Overflow使用某種類型的Markdown修改,它可以進行更智能的重命名,比如將純文本列表更改爲HTML列表......但這一切取決於您需要的內容。如果你只需要處理鏈接,你可以嘗試使用這些正則表達式,但是...

+0

是的,我完全缺乏正則表達式的知識,並試圖谷歌我的問題,並使用該代碼。 –