使用正则表达式替换URL但不替换图像

时间:2014-10-25 10:02:48

标签: php regex

我有一个这样的字符串:

$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:-:符号之间。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

您可以使用此正则表达式:

:-:.*?:-:\W*(*SKIP)(*F)|(?:(?:http|ftp|https)://)?[\w-]+(?:\.[\w-]+)+([\w.,@?^=%&amp;:/~+#-]*[\w@?^=%&amp;\/~+#-])?

RegEx Demo

此正则表达式适用于首先使用:-:指令选择:-:(*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);