如何跳过从函数转换为href到另一个链接的链接

时间:2013-08-04 15:58:06

标签: php

以下是我从url转换为link的功能:

function url_to_link($string){

/*** make sure there is an http:// on all URLs ***/
$string = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2",$string);

/*** make all URLs links ***/
$string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</A>",$string);

/*** make all emails hot links ***/
$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<A HREF=\"mailto:$1\">$1</A>",$string);

return $string;
}

function update_todo() {

    //var input
    $projects_id = $_POST['projects_id'];
    $content = url_to_link($_POST['content']);  // <----- url_to_link()
    $date_created = date('Y-m-d H:i:s');


    $sth = $this->db->prepare('SELECT * FROM `doc_to_do` where projects_id="'.$projects_id.'" ');
    $sth->execute();
    $rows = $sth->fetchAll();
    $total_rows = count($rows);

    if ($total_rows > 0) {
        //update    
        $sql = "UPDATE `doc_to_do` SET content=?  WHERE projects_id=?";
        $sth = $this->db->prepare($sql);
        $sth->execute(array($content,$projects_id));
    }
    else {
        //insert
        $sth = $this->db->prepare('INSERT INTO `doc_to_do` (projects_id, content, date_created) VALUES (:projects_id, :content, :date_created)');
        $sth->execute(array(':projects_id' => $projects_id, ':content' => $content, ':date_created' => $date_created));
    }
}

我尝试使用上面的函数转换我的内容,使其成为链接。首次保存链接时如下所示:

<p><a target="_blank" href="http://stackoverflow.com/">http://stackoverflow.com/</a></p>

当我再次尝试保存时,链接将被破坏:

<p><a target=\"_blank\" href=\"<a target="_blank" href="http://stackoverflow.com/">http://stackoverflow.com/</a>\"><a target="_blank" href="http://stackoverflow.com/">http://stackoverflow.com/</a></a></p>

你可以看到我的功能不够好,它应该忽略链接但只转换网址

2 个答案:

答案 0 :(得分:0)

我首先从我的内容中删除链接,然后创建新的:

function url_to_link($string){

// remove all href to prevent duplicate(when convert) then create new one
$string = strip_tags($string, '<p><b><i><s><ul><ol><li><strong>');

/*** make sure there is an http:// on all URLs ***/
$string = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2",$string);

/*** make all URLs links ***/
$string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>",$string);

/*** make all emails hot links ***/
$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>",$string);

return $string;
}

答案 1 :(得分:0)

每次将文本放入数据库之前,请不要通过url_to_link函数运行文本。存储用户在数据库中输入的原始非HTML数据,并仅在网站上显示URL时将URL转换为HTML链接。所以只有:

echo url_to_link($contentFromDatabase);

将未处理的原始文本存储在数据库中并尽可能晚地处理它总是一个好主意。例如,HTML链接仅适用于HTML。想象一下,您想在稍后的某个时间点以明文电子邮件或其他非HTML格式发送文本;如果你所拥有的只是经过处理的文本,那你就麻烦了。