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


Parse text for hashtags and replace with links using php

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

我想了很多关于如何做到这一点的问题,但我真的不擅长用regex编写这类函数。

示例文本:

Lorem ipsum悲哀坐amet,consectetur adipiscing elit。Vivamus#tristique non-elit eu iaculis。Vivamus eget ultricies nisi。Vivamus hendrerit在意大利风味的mauris调味品店。Donec nibh mauris,pulvinar和#commodo a,porta和tellus。Duis eget ante gravida,康瓦利斯是奥古斯一世,布兰迪是拉图斯。Mauris euismod商品流苏。Sed felis magna,rhoncus vitae mattis varius,sagittis aeros。Donec eget门户网站ipsum#Mauris sed Mauris ante。悬架potenti。Donec a#pretium#auge,eget hendrerit orci。整数cursus像权杖一样的金橘。

尝试使用这个:

$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(单击"运行")。

Regex引用:空格或字符串开头,非捕获组

原始来源:使用RegExp 解析Twitter

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

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

试试这个:

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

这将改变:This is a #hashtag

转换为:This is a <a href="tag/hashtag">hashtag</a>

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

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

$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;

正确答案是这样的。原因不止一个 但最重要的是,您需要考虑到如果您的字符串有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;

在阅读了页面上的其他答案和评论后,从构成标签字符串的内容中排除一些字符似乎是合理的。即:

  1. 白色空间
  2. 大于带有的符号是HTML标记的开头,并且
  3. 经典英语标点符号(如果支持其他语言或场景,请调整必要的标点符号)

其他答案中没有提到,我建议在哈希符号之前使用否定的单词边界。这将强制标签表达式之前的字符不是单词字符。

代码:(演示)

$text = <<<TEXT
Vivamus #tristique non elit eu iaculis.
Donec nibh mauris, pulvinar et #commodo a, porta et tellus. 
Donec eget porta ipsum.#Mauris sed mauris ante.
Donec a #pretium #augue, eget hendrerit orci.
Interference of#hashtag
Hash in <a>#taggytag</a>
"Living my #bestlife"
TEXT;
echo preg_replace('/'B#([^'s<,.?!"]+)/', '<a href="tag/$1">$1</a>', $text);

输出:

Vivamus <a href="tag/tristique">tristique</a> non elit eu iaculis.
Donec nibh mauris, pulvinar et <a href="tag/commodo">commodo</a> a, porta et tellus. 
Donec eget porta ipsum.<a href="tag/Mauris">Mauris</a> sed mauris ante.
Donec a <a href="tag/pretium">pretium</a> <a href="tag/augue">augue</a>, eget hendrerit orci.
Interference of#hashtag
Hash in <a><a href="tag/taggytag">taggytag</a></a>
"Living my <a href="tag/bestlife">bestlife</a>"

如果模式中需要多字节支持,请添加u模式修饰符。/'B#([^'s<,.?!"]+)/u

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

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

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