5

我正在使用 phppreg_replace()将任何前面有标签符号的单词转换为超链接。

所以像:#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

4 回答 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>
于 2011-06-27T16:55:12.630 回答
4

试试这个:

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

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

于 2011-06-27T16:28:05.920 回答
2

您可以通过以下方式实现preg_replace_callback: http: //de2.php.net/manual/en/function.preg-replace-callback.php

于 2011-06-27T16:26:50.157 回答
1

理论上,您可以使用e修饰符,让您在替换字符串中使用 PHP 函数:

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/e', "'<a href=\"/tag/'.strtolower('$1').'\">$0</a>'", $text);
于 2011-06-27T17:01:14.977 回答