自动链接功能无法正常工作

时间:2012-06-26 07:11:18

标签: php regex autolink

我创建了一个PHP函数,它会自动将URL转换为链接,将Twitter @reply用户名链接到其Twitter个人资料,并将电子邮件地址转换为mailto协议的链接。

这是脚本:

function autolink($a, $b){
        $e = "";
        $f = array(
            'link' => '~(http(s|)\:\/\/(www\.|)((\w+)\.(\w+)(\:[0-9]{2,5}|)\.[a-z]{2,5}|(\w+)(\:[0-9]{2,5}|)\.[a-z]{2,5}))((((\/|)\w+)(\.[a-z]{2,5}|))+)(\?(\w+\=\w+(\&|))+|)~',
            'email' => '~\w+\@\w+(\:[0-9]{2,5}|)\.[a-z]{2,5}~',
            'twitter' => '~\@([a-zA-Z_0-9]){1,15}~'
        );
    switch ($b) {
    case "link":$e = preg_replace_callback($f['link'], function ($a) {return '<a href="'.$a.'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break;
    case "email":$e = preg_replace_callback($f['email'], function ($a) {return '<a href="mailto:'.$a.'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break;
    case "twitter":$e = preg_replace_callback($f['twitter'], function ($a) {return '<a href="https://twitter.com/#!/'.str_replace('@','',$a).'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break;
    }
    return $e;
}

我唯一的问题是,它不是返回链接而是返回单词:“Array”。

例如,这个:

autolink("This is my site http://weebuild.biz", "link");

归来这个:

  

这是我的网站数组

应该返回时:

  

这是我的网站<a href="http://weebuild.biz" rel="nofollow" target="_blank">http://weebuild.biz</a>

我写的原始脚本也在JavaSript中:http://jsfiddle.net/shawn31313/umgqR/2/

由于我不是PHP开发人员,因此JavaScript版本具有更多功能。

也许问题是我从JavaScript中获取正则表达式并将其放入PHP中。我不确定PHP中的正则表达式是否与JavaScript不同。

提前致谢。

2 个答案:

答案 0 :(得分:3)

请尝试以下更改:

case "link":$e = preg_replace_callback(
        $f['link'],
        function ($a) {
            return '<a href="'.$a[0].'" rel="nofollow" target="_blank">'.$a[0].'</a>';
        },
        $a
     );
     break;

问题是回调的参数是数组,而不是字符串。

来自docs

  

将调用并传递匹配元素数组的回调   在主题字符串中。回调应该返回替换   字符串。

答案 1 :(得分:2)

回调内部的$a是一个数组并返回如下内容:

Array
(
  [0] => http://weebuild.biz
  [1] => http://weebuild.bi
  [2] => 
  [3] => 
  [4] => weebuild.bi
  [5] => 
  [6] => 
  [7] => 
  [8] => weebuild
  [9] => 
  [10] => z
  [11] => z
  [12] => z
  [13] => 
  [14] => 
  [15] => 

您可能希望引用$a[0]而不是$a。当然,您需要进行一些检查以确保具有该值,并在引用时避免任何意外错误。