PHP将纯文本转换为hashtag链接

PHP将纯文本转换为hashtag链接,php,regex,twitter,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); $text='Testing#一#二#三.test'; $text=preg_replace('/#([0-9

我正在尝试使用PHP将用户的帖子(文本)转换为可点击的标签链接

根据我的发现,hashtag应该只包含字母数字字符

$text = 'Testing#one #two #three.test';
$text = preg_replace('/#([0-9a-zA-Z]+)/i', '<a href="/hashtag/$1">#$1</a>', $text);
$text='Testing#一#二#三.test';
$text=preg_replace('/#([0-9a-zA-Z]+)/i',''$text);
它将链接放置在所有(#一#二#三)上,但我认为不应转换
#一
,因为它与另一个字母数字字符相邻,如何调整reg-ex来解决这个问题


第三个也可以,它只匹配#3,我认为这是正确的。

您可以修改正则表达式以包含非空白字符的负查找,如下所示:

(?<!\S)#([0-9a-zA-Z]+)
(?
工作正则表达式示例:

PHP:


$text=preg_replace('/(?要捕获第二个和第三个没有第一个的hashtag,您需要指定hashtag应该从行首开始,或者在一个或多个空白字符之前,如下所示:

$text = 'Testing#one #two #three.test';
$text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '$1<a href="/hashtag/$2">#$2</a>', $text);
$text='Testing#一#二#三.test';
$text=preg_replace('/(^ |\s+)#([0-9a-zA-Z]+)(\b |$)/','$1',$text);
第三组中的
\b
定义了一个单词边界,当模式后面紧跟着一个非单词字符时,该边界允许模式匹配#3


编辑:以上梅利奥特的回答更有效,请记录。

使用uni代码,html编码安全,并加入regexp;
~(


这里
一些';的标签,如#tag1#tag2#tag3

我不确定你在这里问什么-你可能会得到关于StackOverflow的更好答案。你能澄清一下你的预期结果吗?我想在StackOverflow发布它,我必须打开多个标签。但我认为问题很清楚,我没有找到改进的方法。谢谢,也许您还想添加完整的代码:
$text=preg_replace('/(?不客气!是的,我编辑了答案以包含PHP代码。谢谢:)@Adriant,是的,您可以这样做:
(?我读过一些说明书,上面说hashtags只能以字母开头,但我看到twitter允许这样做。不过代码是有效的。@MElliott大家好,真的感谢你们的回答,我发现它不适用于中文或其他单词。#?
(?<!\S)#([0-9\p{L}]+)
$text = 'Testing#one #two #three.test';
$text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '$1<a href="/hashtag/$2">#$2</a>', $text);