2014-02-28 55 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);