簡體   English   中英

用於將文本鏈接轉換為<a href="“”">標簽的正則表達式在特定用例中中斷</a>

[英]Regex for converting text links to <a href=“”> tags breaks in a certain use case

我有這個正則表達式代碼:

$hike_description = nl2br($hike_description);
//$hike_description = str_replace(array('\n','\r'),'',$hike_description);

//Convert all urls to links
$hike_description = preg_replace('#([\s|^])(www)#i', '$1http://$2', $hike_description);
$pattern = '#((http|https|ftp|telnet|news|gopher|file|wais):\/\/[^\s]+)#i';
$replacement = '<a href="$1" target="_blank">$1</a>';
$hike_description = preg_replace($pattern, $replacement, $hike_description);

它已經工作了 100% 的時間......直到現在。

在此頁面中,代碼第一次不起作用。 具體來說,它沒有在鏈接末尾放置“,因此鏈接一直在頁面的 rest 下方:

http://www.comehike.com/hikes/scheduled_hike.php?hike_id=209

您看到頁面中間的鏈接如何一直延伸到底部並且沒有關閉?

任何線索為什么這一次可能發生而不是其他任何時間?

謝謝!

ps - 這是最終出現在頁面上的 HTML:

<a href="http://maps.google.com/maps?um=1&ie=UTF-8&q=little+river+canyon+center&fb=1&gl=us&hq=little+river+canyon+center&hnear=0x888a614b2e7272e5%3A0x913a5fafeec714d6%2CCentre%2C+AL&ei=GBsFTtedF8vUgAfex6zNAQ&sa=X&oi=local_group&ct=image&ved=0CAQQtgM<br" target="_blank">http://maps.google.com/maps?um=1&ie=UTF-8&q=little+river+canyon+center&fb=1&gl=us&hq=little+river+canyon+center&hnear=0x888a614b2e7272e5%3A0x913a5fafeec714d6%2CCentre%2C+AL&ei=GBsFTtedF8vUgAfex6zNAQ&sa=X&oi=local_group&ct=image&ved=0CAQQtgM<br</a> />

您的正則表達式期望 URL 包含直到下一個空格字符的所有字符。 緊跟在 URL 之后的是 html <br />標簽,您的正則表達式看到的下一個空格是該標簽中/>之前的空格。 所以它認為 URL 還包括該標簽開頭的<br 添加結束</a>時,它被放置在<br />標記內,因此無效。

要快速解決此特定問題,請嘗試更改您的正則表達式以查找<字符以及作為 URL 終止符的空格:

$pattern = '#((http|https|ftp|telnet|news|gopher|file|wais):\/\/[^<\s]+)#i';
                                                         --------^^^----

編輯我認為這是問題的真正根源:

另一種可能性是在進行文本替換之后而不是之前調用nl2br() <br />標記可能事先是換行符。 換行符會被您的正則表達式解釋為空格,並且正則表達式替換不會阻塞。

嘗試將您的模式更改為:

$pattern = '#((http|https|ftp|telnet|news|gopher|file|wais):\/\/[^\s<.]+)#i';

問題是您的正則表達式假定鏈接在遇到空格時結束,但在這種特殊情況下,它以左尖括號結束,即
標簽

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM