我需要匹配仅包含数字的主题标签,并将它们链接到与包含数字和字母的主题标签不同的URL。
到目前为止,我有这个:
function convertHashtags($str){
$number = "/#+([0-9]+)/";
$mixed = "/#+([0-9]*[a-zA-Z]+)/";
$str = preg_replace($number, '<a href="/thread/$1" target="_blank">$0</a>', $str);
$str = preg_replace($mixed, '<a href="/search/$1" target="_blank">$0</a>', $str);
return($str);
}
但是他们并没有像我希望的那样完全正常工作。
例如:#remy5648变为:
<a href="/search/remy" target="_blank">#remy</a>5648
而不是
<a href="/thread/remy5648" target="_blank">#remy5648</a>
另一个例子:#65d987成为:
<a href="/thread/65" target="_blank">#65</a>d987
而不是
<a href="/thread/65d987" target="_blank">#65d987</a>
我需要添加什么来匹配整个单词而不仅仅是它的一部分?
答案 0 :(得分:1)
为你的正则表达式添加数字。您也可以删除第一个preg_replace。他的目标是什么?
function convertHashtags($str)
{
//$number = "/#+([0-9]+)/";
$mixed = "/#+([0-9]*[a-zA-Z0-9]+)/";
/*$str = preg_replace(
$number,
'<a href="/thread/$1" target="_blank">$0</a>',
$str
);*/
$str = preg_replace(
$mixed,
'<a href="/thread/$1" target="_blank">$0</a>',
$str
);
return ($str);
}
当我这样做时,我会得到你期望的值:
<a href="/thread/remy5648" target="_blank">#remy5648</a>
<a href="/thread/65d987" target="_blank">#65d987</a>
答案 1 :(得分:1)
使用preg_replace_callback()
优化匹配:
$str = preg_replace_callback('/#([a-z0-9]+)/', function($match) {
$tag = $match[1];
$url = is_numeric($tag) ? '/thread/' . $tag : '/search/' . $tag;
return '<a href="' . $url . '">#' . $tag . '</a>';
}, $str);
您可能不想替换两次,因为第二次替换可能会替换第一次替换所创建的标记。