解析hashtags的文本并使用php替换链接

时间:2013-06-21 22:37:58

标签: php regex tags

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

我已经考虑了很多关于如何做到这一点,但我真的很难用正则表达式编写这些类型的函数。

示例文字:

  

Lorem ipsum dolor坐下来,精神上的精神。 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。 Suspendisse   势的。 Donec #pretium #augue,eget hendrerit orci。整数诅咒   scelerisque consequat。

6 个答案:

答案 0 :(得分:21)

尝试使用:

$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 stringNon capturing group

原始来源:Parsing Twitter with RegExp

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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

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

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