2014-03-05 89 views
5

我試圖用PHP將用戶的帖子(文本)轉換爲hashtag可點擊的鏈接。PHP將純文本轉換爲hashtag鏈接

從我發現,標籤只應該包含字母數字字符。

$text = 'Testing#one #two #three.test'; 
$text = preg_replace('/#([0-9a-zA-Z]+)/i', '<a href="/hashtag/$1">#$1</a>', $text); 

它把所有的鏈路(#one #two #three),但我認爲#one不應該進行轉換,因爲它旁邊的另一個字母數字字符,如何調整REG-EX以修復?

第三個也行,它只匹配#three,我認爲是正確的。

+0

我不確定你問這裏是什麼 - 你可能會在計算器上更好的答案。你能澄清你的預期結果嗎? –

+0

我打算在StackOverflow上發佈它,我必須打開多個選項卡。但我認爲這個問題很明顯,我沒有辦法改善它。 – adrianTNT

回答

8

你可以修改你的正則表達式來負回顧後的非空白字符,像這樣:

(?<!\S)#([0-9a-zA-Z]+) 

工作正則表達式的例子:

http://regex101.com/r/mR4jZ7

PHP:

$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/', '<a href="/hashtag/$1">#$1</a>', $text); 

編輯: 而爲了讓與其他語言的表達兼容(非英文字符):

(?<!\S)#([0-9\p{L}]+) 

工作例如:

https://regex101.com/r/Pquem3/1

+0

謝謝,也許你還想添加完整的代碼:'$ text = preg_replace('/(?<!\ S)#([0-9a-zA-Z] +)/ m','#$1',$文字);' – adrianTNT

+0

不客氣!是的,我編輯了包含PHP代碼的答案。謝謝。 :) – MElliott

+0

你能告訴我如何跳過數字開頭*的標籤嗎?例如'#123test'。 – adrianTNT

0

趕上第二和第三井號標籤沒有第一個,你需要指定hashtag應該從行首開始,或者在前面加多個空格中的一個,如下所示:

$text = 'Testing#one #two #three.test'; 
$text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '$1<a href="/hashtag/$2">#$2</a>', $text); 

第三組中的\b定義了一個字邊界,該字邊界允許該模式在緊跟其後跟隨一個非單詞字符時與#three匹配。

編輯:MElliott的上面的答案是更有效的,爲記錄。

0

使用uni-code,html編碼安全並加入regexp; ~(?<!&)#([\pL\d]+)~u

這裏some&#39;s tags like #tag1 #tag2#tag3