如何将hashtag文本转换为hashtag超链接?

5

我正在使用php的preg_replace()将任何带有hashtag符号的单词转换为超链接。

因此,像这样的东西:#austin将变成:<a href="/tag/austin">#austin</a>

这是我的正则表达式。

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/', '<a href="/tag/$1">$0</a>', $text);

我的问题是:如果有任何大写字母,href值将保留它们,但我希望href值始终完全小写。

输入:#Austin
不应该变成:<a href="/tag/Austin">#Austin</a>
它应该变成:<a href="/tag/austin">#Austin</a>

我如何修改我的正则表达式以创建这些结果?

4个回答

5
这里是一个示例,使用preg_replace_callback,如@faileN所建议的:

演示链接

$string = '#Austin';

function hashtag_to_link($matches)
{
  return '<a href="/tag/' . strtolower($matches[1]) . '">' . $matches[0] . '</a>';
}

echo preg_replace_callback('/\B#(\w*[a-z_]+\w*)/i', 'hashtag_to_link', $string);

// output: <a href="/tag/austin">#Austin</a>

4

试试这个:

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/', '<a href="/tag/$1">$0</a>', strtolower($text));

在正则表达式进行测试之前,这将强制主题($text)为小写。


但链接文本也将是小写。 - Felix Kling
那似乎是 OP 想要的。 - Winfield Trail
抱歉,我没有明确说明,我希望实际单词大小写保持不变,所以 #Austin 将是 <a href="/tag/austin">#Autsin</a> - floatleft

2

1
在理论上,您可以使用e修饰符,在替换字符串中使用PHP函数:
preg_replace('/\B#(\w*[A-Za-z_]+\w*)/e', "'<a href=\"/tag/'.strtolower('$1').'\">$0</a>'", $text);

这个方法在PHP5.5中被弃用并在PHP7中删除(但逻辑是正确的)。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接