将数字主题标签链接到与包含数字和字母的主题标签不同的URL

时间:2014-10-13 21:03:19

标签: php regex

我需要匹配仅包含数字的主题标签,并将它们链接到与包含数字和字母的主题标签不同的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>

我需要添加什么来匹配整个单词而不仅仅是它的一部分?

2 个答案:

答案 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);

您可能不想替换两次,因为第二次替换可能会替换第一次替换所创建的标记。