2014-02-28 51 views
0

我正在嘗試將推文鏈接起來。但是看起來像「#löövet」的標籤沒有按照我的要求過濾。他們在外國人物面前被切斷。外國字符應該被允許。防止preg_replace替換特殊字符

任何人都知道如何改變正則表達式爲此目的?

下面是我的例子:

//Hashtag 
$tweet = preg_replace("/ +#([a-z0-9_]*)?/i", " <a href=\"http://twitter.com/tag/\\1\" target=\"_blank\">#\\1</a>", $tweet); 



//Problem: 
/* 
* The function above does not match foreign characters as å/ä/ö 
* Tag result example: tag = #löövet 
* After preg_replace: tag = #l öövet 
* Desired after preg_replace: tag = #löövet 
*/ 
+0

添加** **ü標誌圖案可能如果你使用UTF-8編碼工作。當然,既然你已經明確地列出了沒有出現的拉丁字母(a-z和A-Z),這就是你在這種情況下所能得到的。請參閱有關使用啓用Unicode的代碼的其他解答。 –

回答

2

關於如何:

$tweet = preg_replace("/ +#(\p{Xwd}*)/u", " <a href=\"http://twitter.com/tag/$1\" target=\"_blank\">#$1</a>", $tweet); 

\p{Xwd}的含義是:相同與所有的Unicode字母和數字和下劃線。如果你不想下劃線,使用\p{Xan}

+0

你有一個拼寫錯誤''/ +#(\ p {Xwd] *)/ u「'應該是'」/ +#(\ p {Xwd} *)/ u「 '。用大括號代替支架。這似乎工作! –

+0

@AlbinN:你說得對,正確。 – Toto

0

取而代之的是統一的背後運行的,你可以試試這一個,如果你的#標籤不包含任何空間。

/ +#(\S+)/ 
1

使用\ p {L}代替AZ匹配所有Unicode字母(或\ p {L} \ p {N}帶有號碼)

$tweet = preg_replace("/ +#([\p{L}\p{N}_]*)?/i", " <a href=\"http://twitter.com/tag/\\1\" target=\"_blank\">#\\1</a>", $tweet); 

找到更多關於正則表達式的unicode看here

+0

返回'#l v'並且鏈接在第一個「 」之前斷開。我在我的項目中使用了UTF-8 –

0

如果要限制允許字母拉丁字母,你可以使用:

$tweet = preg_replace('/ +#([\p{Latin}0-9_]*)/u', ' <a href="http://twitter.com/tag/$1" target="_blank">#$1</a>", $tweet);