将以www或http开头的多个文本网址转换为绝对链接

时间:2011-02-28 07:37:58

标签: php regex url replace

有许多类似的问题,但我尝试了大约15个不同的preg_match示例,但没有一个完全正常工作。

我有很多用户提交的内容,其中大部分都有网址..有时采用http://www.site.com/page形式,有时像www.site.com,并且通常包含在括号内(www.site.com/page html的)。

我没有找到解析字符串并将所有字符串转换为绝对html链接的模式。想知道是否有人可以帮助我。我发现一些正则表达式找到了似乎可以工作的表达式,但我不知道如何正确转换为绝对html链接,当有些是http和一些没有...

以下是我尝试过的一些表达方式:

function makeLinks($text) {  
    $text = preg_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
        '(<a href="\\1">\\1</a>)', $text);  
    $text = preg_replace('(www\.[a-zA-Z0-9\-]\.[^ ]+)',
        '(<a href="\\1">\\1</a>)', $text);  

        return $text;
}

function makeLinks($text) {
    $text = preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $text);

        return $text;
}

function makeLinks($text) {
    $text = preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank">\0</a>', $text );

        return $text;
}

2 个答案:

答案 0 :(得分:2)

我最终使用了这个字符串,似乎在所有必要的情况下都表现良好:

function makeLinks($text) {
    $text = preg_replace('%(((f|ht){1}tp://)[-a-zA-^Z0-9@:\%_\+.~#?&//=]+)%i',
    '<a href="\\1">\\1</a>', $text);
    $text = preg_replace('%([[:space:]()[{}])(www.[-a-zA-Z0-9@:\%_\+.~#?&//=]+)%i',
    '\\1<a href="http://\\2">\\2</a>', $text);

        return $text;
}

答案 1 :(得分:0)

这是一个好的开始:

function makeLinks($text) {
    $text = preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $text);
    return $text;
}

$ 0是完全匹配。如果您只对没有http://www.http://www.的部分进行分组,则可以将其连接到前面。

如果您仍在寻找答案,请尝试此操作:

function makeLinks($text) {
    $text = preg_replace('~(?:http://|)(?:www\.|)(\S+)~', '<a href="http://www.$1">$0</a>', $text);
    return $text
}