2012-02-23 36 views
0

我在将纯文本转换为url时遇到了一些问题。 我吃点什么,如果我有这样的文字:www.google.com,它会转换为将文本转换为链接 - php正则表达式问题

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

我是怎样的一个正则表达式的小白,但我想这一点:

$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向导来说肯定是一块蛋糕,所以在此先感谢您的帮助。

如果还有其他(更好的)方法将纯文本转换为网址,您可以这么说,我会尝试。

+0

我试着运行你的代码,它确实工作。你使用哪个php版本? – Roberto 2012-02-23 10:01:18

+0

PHP版本5.2.17 – samn 2012-02-23 10:05:04

+1

你可以发布'$ description'的示例值吗? – Roberto 2012-02-23 10:13:25

回答

0

我已经找到了解决办法。它的确与RegEx没有任何关系,这是正确的。我的同事加入这行jQuery代码在头:

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

所以,很显然是被删除的href属性。我没看这个,因为我确信这是一个php/regex问题。删除这个问题解决了这个问题。

我意识到这是一个愚蠢的错误,你不可能解决这个问题,所以感谢所有帮助,+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> 
+0

但是如果文本是这样的:www.google.com,我想要这样:? – samn 2012-02-23 10:48:42

+0

我编辑了上面的代码以处理www网址(通过向href属性添加http://),但它现在可能会创建一些误报(我没有测试过) – scibuff 2012-02-23 12:18:25

2

如果你只问题是该链接错误地指向www.google.com而不是完全限定的URL,如http://www.google.com,则正确的替换为:

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

没有任何根本性错误与他正在使用的正则表达式 - 生成的标记看起来不是有效的(不是在href上的方案) – AD7six 2012-02-23 12:14:39

+0

我从来没有说过他的正则表达式有什么问题。我只是解释说有更好的一个。此外,该解决方案是唯一一个对HTML中使用的URL进行消毒的方法。我认为有一点很重要。如果你只想回答核心问题而不去看大图 - 做我的客人,并降低你想要的全部... – rodneyrehm 2012-02-23 12:20:12

+0

这不是编译好,我得到这个错误:解析错误:语法错误,意外的T_CONSTANT_ENCAPSED_STRING($字符串= preg_replace_callback('#(?i)\ b((?:[az] [\ w - ] +:(?:/ {1,3} | [az ...) – samn 2012-02-23 12:53:03

相关问题