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('/(?<!\S)#([0-9a-zA-Z]+)/m', '<a href="/hashtag/$1">#$1</a>', $text);
不客气!是的,我编辑了答案以包含 PHP 代码。谢谢。 :)
@adrianTNT,是的,你可以这样做:(?<!\S)#([^0-9][0-9a-zA-Z]+)
我读过一些规范说主题标签只能以字母开头,但我看到 twitter 允许这样做。代码虽然有效。
@MElliott 大家好,非常感谢您的回答,我发现它不适用于中文或其他单词。#печаль #грусть #fıstıklıbaklava #чайная #джаз 你能告诉我为什么吗? 【参考方案2】:
使用uni-code,html安全编码并加入正则表达式; ~(?<!&)#([\pL\d]+)~u
这里some&#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将纯文本转换为标签链接的主要内容,如果未能解决你的问题,请参考以下文章