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

Posted

技术标签:

【中文标题】PHP将纯文本转换为标签链接【英文标题】:PHP converting plain text to hashtag link 【发布时间】:2014-04-07 18:54:27 【问题描述】:

我正在尝试使用 php 将用户的帖子(文本)转换为主题标签可点击链接。

根据我的发现,主题标签应该只包含字母数字字符。

$text = 'Testing#one #two #three.test';
$text = preg_replace('/#([0-9a-zA-Z]+)/i', '<a href="/hashtag/$1">#$1</a>', $text);

它将链接放在所有(#one #two #three)上,但我认为 #one 不应该被转换,因为它紧挨着另一个字母数字字符,如何调整正则表达式来解决这个问题?

第三个也可以,只匹配#three,我认为是正确的。

【问题讨论】:

我不确定你在这里问什么 - 你可能会在 *** 上得到更好的答案。你能澄清一下你的预期结果是什么吗? 我打算在 *** 上发布它,我一定打开了多个标签。但我认为问题很明确,我看不到改进它的方法。 【参考方案1】:

您可以修改您的正则表达式以包含非空白字符的否定后视,如下所示:

(?<!\S)#([0-9a-zA-Z]+)

工作正则表达式示例:

http://regex101.com/r/mR4jZ7

PHP:

$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/', '<a href="/hashtag/$1">#$1</a>', $text);

编辑: 并使表达式与其他语言(非英文字符)兼容:

(?<!\S)#([0-9\pL]+)

工作示例:

https://regex101.com/r/Pquem3/1

【讨论】:

谢谢,也许您还想添加完整代码:$text = preg_replace('/(?&lt;!\S)#([0-9a-zA-Z]+)/m', '&lt;a href="/hashtag/$1"&gt;#$1&lt;/a&gt;', $text); 不客气!是的,我编辑了答案以包含 PHP 代码。谢谢。 :) @adrianTNT,是的,你可以这样做:(?&lt;!\S)#([^0-9][0-9a-zA-Z]+) 我读过一些规范说主题标签只能以字母开头,但我看到 twitter 允许这样做。代码虽然有效。 @MElliott 大家好,非常感谢您的回答,我发现它不适用于中文或其他单词。#печаль #грусть #fıstıklıbaklava #чайная #джаз 你能告诉我为什么吗? 【参考方案2】:

使用uni-code,html安全编码并加入正则表达式; ~(?&lt;!&amp;)#([\pL\d]+)~u

这里some&amp;#39;s tags like #tag1 #tag2#tag3等等。

【讨论】:

【参考方案3】:

要在没有第一个的情况下捕获第二个和第三个主题标签,您需要指定主题标签应该从行首开始,或者在多个空格字符之一之前,如下所示:

$text = 'Testing#one #two #three.test';
$text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '$1<a href="/hashtag/$2">#$2</a>', $text);

第三组中的\b 定义了一个单词边界,当它紧跟一个非单词字符时,它允许模式匹配#three。

编辑:MElliott 上面的回答更有效,记录在案。

【讨论】:

【参考方案4】:

最后我找到了解决方案,例如:facebook 或其他主题标签到 url 解决方案,它也可能对您有所帮助。此代码也适用于 unicode。我使用了一些 Bangla Unicode,让我知道其他语言也可以,我认为它适用于任何语言。

$str = '#Your Text #Unicode #ফ্রিকেলস বা #তিল মেলানিনের #অতিরিক্ত উৎপাদনের জন‍্য হয় যা #সূর্যালোকে #বাড়ে';
$regex = '/(?<!\S)#([0-9a-zA-Z\pL\pM]+)/mu';
$text = preg_replace($regex, '<a href="' . BASE . 'search?q=$1">#$1</a>', $str);
echo $text;

【讨论】:

6 年前发布了使用 Unicode 字符的解决方案,更不用说对已接受答案的编辑了。这对那些解决方案有改进吗?如何?编辑您的问题以包含此信息。 \pL 不包括 a-z 吗?

以上是关于PHP将纯文本转换为标签链接的主要内容,如果未能解决你的问题,请参考以下文章

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

将纯文本呈现为 HTML 维护空白 - 没有 <pre>

PHP文本路径转换为链接文字

PHP Linkify - 将文本转换为链接

PHP 将文本转换为链接

powershell 将纯文本字符串转换为安全字符串