繁体   English   中英

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

[英]Parse text for hashtags and replace with links using php

我有一些带有 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 fringilla。 Sed felis magna、rhoncus vitae mattis varius、sagittis a eros。 Donec eget porta ipsum。 #Mauris sed mauris ante。 暂停潜力。 Donec #pretium #augue,eget hendrerit orci。 整数 cursus scelerisque consequat。

尝试使用这个:

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

正则表达式参考: 空格或字符串开头非捕获组

原文来源:用 RegExp 解析 Twitter

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

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. 大于符号 with 是 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM