PHP将纯文本转换为主题标签链接

时间:2014-03-05 15:12:27

标签: php regex twitter

我正在尝试使用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,我认为是正确的。

3 个答案:

答案 0 :(得分:11)

你可以将你的正则表达式修改为非空格字符的负反面,如下所示:

(?<!\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

答案 1 :(得分:0)

要捕获没有第一个标签的第二个和第三个标签,您需要指定标签应该从行的开头开始,或者在空格的一个或多个字符之前指定,如下所示:

$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上面的回答更有效率,记录。

答案 2 :(得分:0)

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

此处some&#39;s tags like #tag1 #tag2#tag3等。