首页 > 解决方案 > 解析文本中的 Instagram 用户名并用链接替换它们

问题描述

因此,根据此处的其他一些帖子,我能够使用以下方法从文本字符串中解析主题标签:

preg_replace('/(?:^|\s)#(\w+)/', ' <a href="https://instagram.com/tags/$1">$1</a>', $text);

这将每个主题标签都变成了可点击的链接,这很棒!

但是,对于 Instagram 用户名(以 @ 开头),我使用以下内容:

preg_replace('/(?:^|\s)@(\w+)/', ' <a href="https://instagram.com/$1">$1</a>', $text);

但问题是:用户名也可以包含点 (.)。

所以我把它改成:

preg_replace('/(?:^|\s)#([\w.]+)/', ' <a href="https://instagram.com/tags/$1">$1</a>', $text);

但这样做的问题是,以@mention 结尾的句子将在用户名中添加结束句子的点 (.)。

所以我需要的是一个正则表达式,它包含带点的单词,但不是末尾的点(点后跟空格,或者是字符串的最后一个字符)。

例如:

Hi this is a @test to parse @insta.usernames using @regular.expressions.

应该返回:

@test
@insta.usernames
@regular.expressions

任何帮助是极大的赞赏!

标签: phpregex

解决方案


如果用户名不能以点结尾并且不能连续或只有点,您可以使用:

(?:^|\s)[@#](\w+(?:\.\w+)*)

请注意,在您尝试的模式中,(?:^|\s)@(\w+)组 1 值包含@

正则表达式演示| php演示


另一种选择可能是(包括@或#)

(?<!\S)[@#]\w+(?:\.\w+)*

正则表达式演示| php演示

并且在替换中使用完全匹配$0


推荐阅读