我有一个这样的字符串:
$str = ':-:casperon.png:-: google.com www.yahoo.com :-:sample.jpg:-: http://stackoverflow.com';
我需要从$str
替换网址,而不是像casperon.png
这样的图片。
我已尝试使用以下正则表达式替换网址。
$regex = '/((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/';
$str = preg_replace_callback( $regex, 'replace_url', $str);
和php函数如下。
function replace_url($m){
$link = $name = $m[0];
if ( empty( $m[1] ) ) {
$link = "http://".$link;
}
return '<a href="'.$link.'" target="_blank" rel="nofollow">'.$name.'</a>';
}
但它将图像替换为链接。但我需要正常的图像。只需要更换网址。所以我把图像放在:-:image:-:
符号之间。任何人都可以帮助我吗?
答案 0 :(得分:4)
您可以使用此正则表达式:
:-:.*?:-:\W*(*SKIP)(*F)|(?:(?:http|ftp|https)://)?[\w-]+(?:\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&\/~+#-])?
此正则表达式适用于首先使用:-:
指令选择:-:
和(*SKIP)(*F)
以及丢弃的不需要的文字的概念。
答案 1 :(得分:1)
你可以改变你的代码,使用filter_var检查可能的网址:
function replace_url($m){
$link = (empty($m[1])) ? 'http://' . $m[0] : $m[0];
if (!filter_var($link, FILTER_VALIDATE_URL))
return $m[0];
return '<a href="' . $link . '" target="_blank" rel="nofollow">' . $m[0] . '</a>';
}
$regex = '~((?:https?|ftp)://)?[\w-]+(?>\.[\w-]+)+(?>[.,]*(?>[\w@?^=%/\~+#;-]+|&(?:amp;)?)+)*~';
$str = preg_replace_callback( $regex, 'replace_url', $str);