将文本转换为链接 - php正则表达式问题

时间:2012-02-23 09:53:28

标签: php regex url

将纯文本转换为网址时遇到了一些问题。 我喜欢的是,如果我有这样的文字:www.google.com,它会转换为

<a href="www.google.com" target="_blank">www.google.com</a>

我有点像RegEx noob,但我试过这个:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $description);

描述var是一段文本,可以包含未转换的URL。

使用上面的代码,我将其作为链接:

<a target="_blank">www.google.com</a>

所以href部分被遗漏了。对于RegEx巫师来说,这一定是小菜一碟,所以提前感谢每一个帮助。

如果有另一种(更好的?)方法将纯文本转换为url,你可以这样说,我会试试。

4 个答案:

答案 0 :(得分:2)

如果您唯一的问题是该链接错误地指向www.google.com而不是完全限定的网址,例如http://www.google.com,那么正确的替换将是:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="http://$1" target="_blank">$1</a>', $description);

答案 1 :(得分:1)

<a href="www.example.com">www.example.com</a>在现代浏览器中无法正常工作,因为href值只会附加到当前页面网址,例如http://example.com/www.example.com。您需要指定协议,即。 http / https等

以下内容将替换以ftp,http,https和带有html标签的文件开头的所有文本“链接”

<?php

    $pattern = '/(www|ftp|http|https|file)(:\/\/)?[\S]+(\b|$)/i';
    $string = 'hello http://example.com https://graph.facebook.com    http://www.example.com www.google.com';

    function create_a_tags( $matches ){

        $url = $matches[0];
        if ( 'www' == $matches[1] ){
            $url = 'http://' . $matches[0];
        }
        $escaped = htmlspecialchars($matches[0]);
        return sprintf( '<a href="%s">%s</a>', $url, $escaped );
    }

    echo preg_replace_callback( $pattern, 'create_a_tags', $string );

?>

打印

hello <a href="http://example.com">http://example.com</a>
<a href="https://graph.facebook.com">https://graph.facebook.com</a>
<a href="http://www.example.com">http://www.example.com</a>
<a href="http://www.google.com">www.google.com</a>

答案 2 :(得分:0)

很久以前,我们比较了不同的URL验证和识别方法。请参阅正则表达式的table

我建议您放弃正则表达式并使用gruber revised代替。 A(PHP 5.3)解决方案可能如下所示:

<?php

$string = 'hello 
http://example.com 
https://graph.facebook.com 
http://www.example.com
www.google.com
ftp://example.com';

$string = preg_replace_callback('#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))#iS', function($m) {
    // use http as default protocol, if none given
    if (strpos($m[0], '://') === false) {
        $m[0] = 'http://' . $m[0];
    }
    // text -> html is a context switch, take care of special characters
    $_m = htmlspecialchars($m[0]);
    return '<a href="' . $_m . '" target="_blank">' . $_m . '</a>';
}, $string);

echo $string, "\n";

答案 3 :(得分:0)

我找到了解决方案。它确实与RegEx没有任何关系,这是正确的。我的同事在头部添加了这行jquery代码:

$("a").removeAttr('href');

很明显,href属性被删除了。我没有看这个,因为我确定这是一个php / regex问题。删除此问题解决了这个问题。

我意识到这是一个愚蠢的错误,你不可能解决这个问题,所以感谢所有帮助,给你们+1。