【问题标题】:Auto link function not working properly自动链接功能无法正常工作
【发布时间】:2012-06-26 07:11:18
【问题描述】:

我创建了一个 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 不同。

提前致谢。

【问题讨论】:

    标签: php regex autolink


    【解决方案1】:

    尝试以下更改:

    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

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

    【讨论】:

    • 谢谢你,我试着把所有的 $a 改成 $a[0]。这似乎是唯一的变化
    • 没错,就是$a => $a[0]。我只是将答案格式化为更具可读性。
    【解决方案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。当然,您需要进行一些检查以确保存在该值并避免在引用它时出现任何意外错误。

    【讨论】:

    • 哦,我明白了。好吧,我不是真正的 PHP 开发人员,所以我习惯了不返回数组的 JavaScript 方式。
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多