2012-02-23 37 views
0

我在將純文本轉換爲url時遇到了一些問題。 我吃點什麼,如果我有這樣的文字:www.google.com,它會轉換爲將文本轉換爲鏈接 - php正則表達式問題

<a href="www.google.com" target="_blank">www.google.com</a> 

我是怎樣的一個正則表達式的小白,但我想這一點:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $description); 

描述var是一段文字,可以包含未轉換的url。

通過上面的代碼中,我得到這樣的鏈接:

<a target="_blank">www.google.com</a> 

所以在href部分被排除在外。這對您RegEx嚮導來說肯定是一塊蛋糕,所以在此先感謝您的幫助。

如果還有其他(更好的)方法將純文本轉換爲網址,您可以這麼說,我會嘗試。

+0

我試着運行你的代碼,它確實工作。你使用哪個php版本? – Roberto 2012-02-23 10:01:18

+0

PHP版本5.2.17 – samn 2012-02-23 10:05:04

+1

你可以發佈'$ description'的示例值嗎? – Roberto 2012-02-23 10:13:25

回答

0

我已經找到了解決辦法。它的確與RegEx沒有任何關係,這是正確的。我的同事加入這行jQuery代碼在頭:

$("a").removeAttr('href'); 

所以,很顯然是被刪除的href屬性。我沒看這個,因爲我確信這是一個php/regex問題。刪除這個問題解決了這個問題。

我意識到這是一個愚蠢的錯誤,你不可能解決這個問題,所以感謝所有幫助,+1給你們。

1

<a href="www.example.com">www.example.com</a>在現代瀏覽器中無法正常工作,因爲href值只會附加到當前網頁網址,例如, http://example.com/www.example.com。你需要指定協議,即。 HTTP/HTTPS等

下面將取代所有文字 「鏈接」 開始,FTP,HTTP,HTTPS和與HTML文件一個標籤

<?php 

    $pattern = '/(www|ftp|http|https|file)(:\/\/)?[\S]+(\b|$)/i'; 
    $string = 'hello http://example.com https://graph.facebook.com http://www.example.com www.google.com'; 

    function create_a_tags($matches){ 

     $url = $matches[0]; 
     if ('www' == $matches[1]){ 
      $url = 'http://' . $matches[0]; 
     } 
     $escaped = htmlspecialchars($matches[0]); 
     return sprintf('<a href="%s">%s</a>', $url, $escaped); 
    } 

    echo preg_replace_callback($pattern, 'create_a_tags', $string); 

?> 

打印

hello <a href="http://example.com">http://example.com</a> 
<a href="https://graph.facebook.com">https://graph.facebook.com</a> 
<a href="http://www.example.com">http://www.example.com</a> 
<a href="http://www.google.com">www.google.com</a> 
+0

但是如果文本是這樣的:www.google.com,我想要這樣:? – samn 2012-02-23 10:48:42

+0

我編輯了上面的代碼以處理www網址(通過向href屬性添加http://),但它現在可能會創建一些誤報(我沒有測試過) – scibuff 2012-02-23 12:18:25

2

如果你只問題是該鏈接錯誤地指向www.google.com而不是完全限定的URL,如http://www.google.com,則正確的替換爲:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="http://$1" target="_blank">$1</a>', $description); 
0

不久之前,我們比較了不同的URL驗證和識別方法。請參閱正則表達式的table

我建議你放棄你的正則表達式並改用gruber revised。 A(PHP 5.3)的解決方案可能看起來像:

<?php 

$string = 'hello 
http://example.com 
https://graph.facebook.com 
http://www.example.com 
www.google.com 
ftp://example.com'; 

$string = preg_replace_callback('#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»「」‘’]))#iS', function($m) { 
    // use http as default protocol, if none given 
    if (strpos($m[0], '://') === false) { 
     $m[0] = 'http://' . $m[0]; 
    } 
    // text -> html is a context switch, take care of special characters 
    $_m = htmlspecialchars($m[0]); 
    return '<a href="' . $_m . '" target="_blank">' . $_m . '</a>'; 
}, $string); 

echo $string, "\n"; 
+0

沒有任何根本性錯誤與他正在使用的正則表達式 - 生成的標記看起來不是有效的(不是在href上的方案) – AD7six 2012-02-23 12:14:39

+0

我從來沒有說過他的正則表達式有什麼問題。我只是解釋說有更好的一個。此外,該解決方案是唯一一個對HTML中使用的URL進行消毒的方法。我認爲有一點很重要。如果你只想回答核心問題而不去看大圖 - 做我的客人,並降低你想要的全部... – rodneyrehm 2012-02-23 12:20:12

+0

這不是編譯好,我得到這個錯誤:解析錯誤:語法錯誤,意外的T_CONSTANT_ENCAPSED_STRING($字符串= preg_replace_callback('#(?i)\ b((?:[az] [\ w - ] +:(?:/ {1,3} | [az ...) – samn 2012-02-23 12:53:03

相關問題