解析主题标签的文本并使用 php 替换为链接

Posted

技术标签:

【中文标题】解析主题标签的文本并使用 php 替换为链接【英文标题】:Parse text for hashtags and replace with links using php 【发布时间】:2013-06-19 04:18:45 【问题描述】:

我有一些带有 twitter 风格#hashtags 的文本。我将如何编写一个函数来解析可能包含无限数量#hashtags的文本正文,获取主题标签的文本并将它们全部替换为<a href="tag/[hashtag text]">[hashtag text]</a>

我想了很多关于如何做到这一点,但我真的不擅长用正则表达式编写这类函数。

示例文本:

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Vivamus #tristique non elit eu iaculis。 Vivamus eget ultricies nisi。 mauris condimentum scelerisque 的 Vivamus hendrerit。 Donec nibh mauris, pulvinar et #commodo a, porta et Tellus。 Duis eget ante gravida, convallis augue id, blandit lectus。 Mauris euismod commodo mi ut 弗林吉拉。 Sed felis magna, rhoncus vitae mattis varius, sagittis a 爱神。 Donec eget porta ipsum。 #Mauris sed mauris ante。悬念 潜力。 Donec #pretium #augue,eget hendrerit orci。整数光标 scelerisque 后果。

【问题讨论】:

显示文本示例,以及解析后该文本的结果 【参考方案1】:

试试这个:

$text = "Vivamus #tristique non elit eu iaculis.";
$text = preg_replace('/(?:^|\s)#(\w+)/', ' <a href="tag/$1">$1</a>', $text);
// $text now: Vivamus <a href="tag/tristique">tristique</a> non elit eu iaculis;

它正在运行:https://3v4l.org/WXqTr(点击运行)。

正则表达式参考:Space or beginning of string、Non capturing group

原文来源:Parsing Twitter with RegExp

【讨论】:

这要求在主题标签之前有一个空格字符,这样#hashtag blah blah blah 就不会被捕获。 +1 - 我忘了字字符\w,这比[^\s] 这不适用于包含主题标签的链接。会坏的。 @MikeBarwick - 最初的问题没有提到这一点,但这是一个有效的观点,我已对其进行了更新以解决问题。【参考方案2】:

这将适用于 UTF-8 编码文本,并将在内容中的标签前显示 #(哈希)

preg_replace('/(\#)([^\s]+)/', ' <a href="tag/$2">#$2</a> ', $content);

【讨论】:

我确认这适用于希腊字符(UTF-8),而上述解决方案仅适用于英文字符!谢谢【参考方案3】:

试试这个:

preg_replace('/(\#)([^\s]+)/', '<a href="tag/$2">$2</a>', $your_content_here);

这将变成这样:This is a #hashtag

进入这个:This is a &lt;a href="tag/hashtag"&gt;hashtag&lt;/a&gt;

假设你有$your_content_here = 'This is a #hashtag';

【讨论】:

Awww 太棒了:) @Joe 的正则表达式实际上要好一些——我的可以让您在主题标签中使用逗号、句点或其他符号。当然,要看你想怎么定义“hashtag”【参考方案4】:

无论标签之间没有空格,它都会提取并添加到文本中每个标签的链接。

$text = "#test Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus #tristique non elit eu iaculis. Vivamus eget ultricies nisi. Vivamus hendrerit at mauris condimentum scelerisque. Donec nibh mauris, pulvinar et #commodo a, porta et tellus. Duis eget ante gravida, convallis augue id, blandits.Repost#high#fashion#photography#Ishan#portart#photo#Shoot#EishaChopra#luxe#twisty#creative#destination#style#Actor#model#beauty#gorgeous#makeup#and#hair#kamaldeep#fashionista#trending ";
$text = preg_replace('/#(\w+)/', ' <a href="tag/$1">$1</a>', $text);
echo $text;

【讨论】:

【参考方案5】:

正确答案是这样。原因不止一个。但最重要的是,您需要考虑您的字符串是否包含 URL,否则所有其他答案都会中断。请参见下面的示例:

$text = "#test Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus #tristique non elit eu iaculis. Vivamus eget ultricies nisi. Vivamus hendrerit at mauris condimentum scelerisque. Donec nibh mauris, pulvinar et #commodo a, porta et tellus. Duis eget ante gravida, convallis augue id, blandit lectus. Mauris euismod commodo mi ut fringilla. Sed felis magna, rhoncus vitae mattis varius, sagittis a eros. Donec eget porta ipsum. #Mauris sed mauris ante. Suspendisse potenti. Donec a #pretium #augue, eget hendrerit orci. Integer cursus scelerisque consequat. http://www.example.com/#wdwd/dwdqwdqwdqw#dwqdqwdq";

$text = preg_replace('/(^|[\n\s])#([^\s"\t\n\r<:]*)/is', '$1<a href="http://twitter.com/search?q=%23$2">#$2</a>', $text);

echo $text;

【讨论】:

虽然这是最好的答案,但它仍然不能 100% 地适用于我正在使用的文本。问题是如果我的主题标签直接出现在 html 标签之后,即如果文本是“

#whatever

”,那么它不会找到它。我想是因为标签前没有空格?我怎么能调整正则表达式以匹配呢? (对不起,如果这是一个愚蠢的问题,我从来没有真正学习过正则表达式)
【参考方案6】:

我结合了 Joe 和 jraede 的解决方案。

UTF-8 安全且正确的标签格式(无逗号等):

preg_replace('~(\#)([^\s!,. /()"\'?]+)~', '<a href="tag/$2">#$2</a>', $text);

【讨论】:

以上是关于解析主题标签的文本并使用 php 替换为链接的主要内容,如果未能解决你的问题,请参考以下文章

当用户使用flutter键入一些文本时,如何解析和替换单词作为主题标签链接?

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

DS标签控件文本解析格式

在悬停时更改文本并替换为原始文本

将 Google 图片链接及其关键字保存在数据库或文本文件中

CSS 导航:当鼠标悬停在图标上时,图标应替换为文本链接