提问人:adrianTNT 提问时间:3/5/2014 更新时间:12/30/2021 访问量:5485
PHP将纯文本转换为主题标签链接
PHP converting plain text to hashtag link
问:
我正在尝试使用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,我认为这是正确的。
答:
13赞
Bryan Elliott
3/5/2014
#1
您可以修改正则表达式以包含非空格字符的否定后视,如下所示:
(?<!\S)#([0-9a-zA-Z]+)
工作正则表达式示例:
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
评论
0赞
adrianTNT
3/6/2014
谢谢,也许您还想添加完整的代码:$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/m', '<a href="/hashtag/$1">#$1</a>', $text);
0赞
Bryan Elliott
3/6/2014
别客气!是的,我编辑了答案以包含PHP代码。谢谢。:)
1赞
Bryan Elliott
3/6/2014
@adrianTNT,是的,你可以这样做:(?<!\S)#([^0-9][0-9a-zA-Z]+)
1赞
adrianTNT
3/6/2014
我读过一些规范,说主题标签只能以字母开头,但我看到 twitter 允许它。不过,代码有效。
1赞
PrateekSaluja
5/19/2017
@MElliott大家好,真的很感谢你的回答,我发现它不适用于中文或其他一些词.#печаль #грусть #fıstıklıbaklava #чайная #джаз 你能告诉我为什么吗?
0赞
Benjamin Nolan
3/6/2014
#2
要捕获第二个和第三个主题标签而不使用第一个主题标签,您需要指定主题标签应从行的开头开始,或者位于空格的多个字符之一之前,如下所示:
$text = 'Testing#one #two #three.test';
$text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '$1<a href="/hashtag/$2">#$2</a>', $text);
第三组定义了一个单词边界,当模式后面紧跟着一个非单词字符时,它允许模式匹配 #three。\b
编辑:MElliott 上面的回答更有效,作为记录。
2赞
Kerem
7/7/2015
#3
使用 uni-code,html 编码安全并加入正则表达式;~(?<!&)#([\pL\d]+)~u
这里等等。some's tags like #tag1 #tag2#tag3
评论
0赞
Saghachi
2/22/2023
这个正则表达式是唯一可以处理所有内容(包括非英语和行首标签)的正则表达式,谢谢
2赞
Monzur
12/8/2021
#4
最后,我找到了解决方案,例如: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;
评论
0赞
miken32
12/8/2021
6 年前发布了使用 Unicode 字符的解决方案,更不用说对接受的答案的编辑了。这是否改进了这些解决方案?如何?编辑您的问题以包含此信息。不包括 a-z?\p{L}
评论