链接转换

时间:2016-07-19 17:33:17

标签: php optimization

我已将此链接转换为将网址放入<a></a>标记的

function convert_links($text) {
    $text = explode(' ',$text);
    for($i=0;$i<count($text);$i++) {
        if(filter_var($text[$i], FILTER_VALIDATE_URL))
            $text[$i] = "<a href='".$text[$i]."' target='_blank'>".$text[$i]."</a>";
        else 
            $text[$i] = $text[$i];
    }
    return implode(' ',$text);
}

我是优化的新手,所以我想问:我可以让这个功能更好/更快吗?我听说array_filter在这种情况下是更好的选择,但我不能让它工作。谢谢你的帮助!

现在我已经使用array_map创建了另一个函数。那么哪一个更好用?

function convert_links($text) {
    $text = explode(' ', $text);
    function convert_link($val) {
        if(filter_var($val,FILTER_VALIDATE_URL))
            return "<a href='".$val."' target='_blank'>".$val."</a>";
        else
            return $val;
    }
    $text = array_map('convert_link',$text);
    return implode(' ',$text);
}

Danielius

1 个答案:

答案 0 :(得分:1)

作为替代方案,您可以使用preg_replace_callback

function convert_links($text) {
    return preg_replace_callback("/\S+:\S+/", function ($match) {
        return filter_var($val = $match[0], FILTER_VALIDATE_URL)
            ? "<a href='$val' target='_blank'>$val</a>"
            : $val;
    }, $text);
}

请注意:

  • 您可以拥有一个if和三元运算符return,而不是return包含两个? ... :语句。
  • 在双引号字符串中,您可以嵌入变量;无需与.连接。
  • 如果网址被空格以外的其他空格分隔(如换行符,制表符,...),则此功能也有效。
  • 正则表达式要求单词至少包含一个:,而不是单词的开头或结尾。这样可以避免对“正常”字词进行更加昂贵的filter_var调用。