防止preg_replace替换特殊字符

时间:2014-02-28 14:52:38

标签: php regex preg-replace

我正在尝试关联Twitter帖子。但是看起来像“#löövet”的主题标签并没有像我希望的那样得到过滤器。他们在外国人物之前被切断了。应该允许外国字符。

任何人都知道如何为此目的改变正则表达式?

以下是我的例子:

//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
*/   

4 个答案:

答案 0 :(得分:2)

怎么样:

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

\p{Xwd}\w的含义相同,包含所有unicode字母,数字和下划线。

如果您不想使用下划线,请使用\p{Xan}

答案 1 :(得分:1)

使用\ p {L}代替a-z匹配所有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);

在regexp中查找有关unicode的更多信息,请查看here

答案 2 :(得分:0)

如果你的主题标签不包含任何空格,你可以试试这个,而不是在unicode后面运行。

/ +#(\S+)/

答案 3 :(得分:0)

如果您想将允许的字母限制为拉丁字母,您可以使用:

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