我创建了一个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不同。
提前致谢。
答案 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
。当然,您需要进行一些检查以确保具有该值,并在引用时避免任何意外错误。