2011-06-29 47 views
1

I have this regex code:用於將文本鏈接轉換爲<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); 

It has worked 100% of the time....until now.

In this page the code didn't work for the first time. Specifically, it didn't place the " at the end of the link so the link kept going down the rest of the page:

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> /> 
+0

我加入HTML開始結束到我的問題的底部,但它也打破了這個問題:))))))它出現的方式不是我如何粘貼它! – Genadinik

+1

我們可以看到輸入,而不是輸出 - 你已經告訴我們,已經連接了你的網頁 – tobyodavies

+0

是的,我們需要在你做任何PHP處理之前看到URL –

回答

3

你的正則表達式預計該URL包括所有字符,直到下一個空格字符。緊跟在URL後面的是一個html <br />標記,正則表達式看到的下一個空格是該標記中的/>之前的空格。所以它認爲該網址在該標籤的開頭還包含<br。當關閉</a>被添加時,它被放置在<br />標籤內,因此失效。

對於一個快速解決這一特定問題,請嘗試更改您的正則表達式來查找<字符以及一個空間是一個URL終止:

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

編輯我覺得這是問題的真正根源:

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

+0

@Michael我剛剛添加了<字符正則表達式,但它並不完美。我在哪裏出了問題?問題更多的是編碼這個並將其放入數據庫的代碼?這是真正的罪魁禍首嗎?謝謝! – Genadinik

+0

@Genadinik我認爲你出錯的地方(更多地考慮它)是你在做文本替換之前調用'nl2br()'。如果該網址末尾有換行符,則會將其轉換爲'
',然後您的正則表達式被阻塞。 –

+0

@Michael是否應該嘗試將nl2br放在正則表達式之後? – Genadinik

1

鏈接以<br結尾。這會啓動一個標籤,但您永遠不會關閉它。它也「吃」</a>,這應該是關閉開放<a>。在將其輸入到頁面之前,您需要避開您的輸入。

請注意,您可能想要轉義其他字符,例如&。您可能要檢查這個問題的答案:

具體而言,本頁面:

+0

你的意思是問題是關於我如何把事情進入數據庫而不是當我將它們從那裏分離出來時會發生什麼? – Genadinik

+0

它可能不是數據庫相關的 - 無論你放在頁面上,都應該按照上述鏈接轉義。所以,如果你想把'<'放在HTML中,你應該把'<'放在''。嘗試使用純HTML(例如,放入'Hello world',你會明白我的意思 - 這與HTML以外的東西無關)。 –

1

試着改變你的模式:

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

的問題是,你的正則表達式假設鏈接遇到空間時結束,但在這種特殊情況下,它與左邊的角支架,該支架是
標籤的

+0

剛剛嘗試過,但沒有工作:( – Genadinik

+0

@Genadinik:對不起,沒有幫助你,但我沒有真正嘗試執行它,我認爲它應該可以工作,但也許可能有某些東西在[^\ s <。],可能是點,你可以嘗試刪除它嗎? – Abhay