我创建了一个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;
}
我遇到的唯一问题是,它不返回链接,而是返回单词:"数组"。
例如,这个:
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不同。
提前谢谢。
尝试以下更改:
case "link":$e = preg_replace_callback(
$f['link'],
function ($a) {
return '<a href="'.$a[0].'" rel="nofollow" target="_blank">'.$a[0].'</a>';
},
$a
);
break;
问题是回调的参数将是一个数组,而不是一个字符串。
从文档中:
将调用并传递匹配元素数组的回调 在主题字符串中。回调应返回替换 字符串。
回调内部的$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
。当然,您需要进行一些检查以确保存在该值,并避免在引用它时出现任何意外错误。