[英]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 />
標記可能事先是換行符。 換行符會被您的正則表達式解釋為空格,並且正則表達式替換不會阻塞。
該鏈接以<br
結尾。 這會啟動一個標簽,但您永遠不會關閉它。 它還“吃掉”應該關閉開口<a>
的</a>
。 您需要先轉義您的輸入,然后再將其放入頁面。
請注意,您可能想要轉義其他字符,例如&
。 你可能想檢查這個問題的答案:
具體來說,這個頁面:
$pattern = '#((http|https|ftp|telnet|news|gopher|file|wais):\/\/[^\s<.]+)#i';
問題是您的正則表達式假定鏈接在遇到空格時結束,但在這種特殊情況下,它以左尖括號結束,即
標簽
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.