将纯文本转换为标签链接的PHP方法

7

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

据我所发现,标签应仅包含字母数字字符。

$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不应被转换,因为它紧挨着另一个字母数字字符,如何调整正则表达式来修复它?第三个是也可以的,它只匹配#three,这我认为是正确的。

我不确定你在这里问什么 - 你可能会在StackOverflow上得到更好的答案。你能澄清一下你想要的结果是什么吗? - Craig Watson
我本来想在StackOverflow上发布它,可能是因为我打开了多个选项卡。但我认为问题很清楚,我看不到任何改进的方法。 - adrianTNT
4个回答

13
您可以修改正则表达式,加入一个负向回顾后发现非空格字符,如下所示:
(?<!\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

该示例展示了一个正则表达式的使用。

谢谢,也许你想添加完整的代码:$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/m', '<a href="/hashtag/$1">#$1</a>', $text); - adrianTNT
不用谢!是的,我编辑了答案并包含了 PHP 代码。谢谢 :) - Bryan Elliott
1
@adrianTNT,是的,你可以这样做:(?<!\S)#([^0-9][0-9a-zA-Z]+) - Bryan Elliott
1
我读到一些规范,说标签只能以字母开头,但我看到 Twitter 允许这样做。不过代码可以正常工作。 - adrianTNT
1
@MElliott 你好,感谢你的回答。我发现这个方法对中文或其他一些词语不起作用。#悲伤 #忧愁 #开心果糕点 #茶 #爵士音乐。你能告诉我为什么吗? - PrateekSaluja
显示剩余7条评论

2

最终我找到了类似于Facebook或其他标签到URL的解决方案,这可能也会对您有所帮助。此代码还适用于Unicode。我已经使用了一些孟加拉Unicode,请告诉我其他语言是否也可以工作,我认为它将适用于任何语言。

$str = '#Your Text #Unicode #ফ্রিকেলস বা #তিল মেলানিনের #অতিরিক্ত উৎপাদনের জন‍্য হয় যা #সূর্যালোকে #বাড়ে';
$regex = '/(?<!\S)#([0-9a-zA-Z\p{L}\p{M}]+)/mu';
$text = preg_replace($regex, '<a href="' . BASE . 'search?q=$1">#$1</a>', $str);
echo $text;

6年前发布了一个使用Unicode字符的解决方案,更不用说采纳答案的编辑了。这个方法有什么改进吗?怎么改进?编辑您的问题以包括这些信息。\p{L}不包括a-z吗? - miken32

2

使用unicode、html编码安全和连接的正则表达式; ~(?<!&)#([\pL\d]+)~u

这里有一些标签,例如#tag1 #tag2#tag3等。


这个正则表达式是唯一一个能够处理包括非英语和以井号开头的行的所有内容的好工具,谢谢。 - Saghachi

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上面的答案更有效率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接