解析链接,src=""中的链接除外


Parse links, except for links inside a src=""

我得到了以下代码,用相应的链接替换了URL:

$in = array
(
        '/(?:^|'b)((((http|https|ftp):'/'/)|(www'.))(['w'.]+)([,:%#&'/?='w+'.-]+))(?:'b|$)/is'
);
$out = array
(
        "<a href='"$1'" target='"_blank'">$1</a>"
);
return preg_replace($in, $out, $url);

但是,我不希望SRC="url"属性中的url被转换成链接。

我如何从这个模式中排除包含在属性中的URL ?

更新:输入将是:

Bellow you can see http://www.yahoo.com bla bla
<iframe src="http://yahoo.com"></frame

它需要解析第一个链接,而不是src="

中的URL。

使用以下php代码提取除src=""以外的链接

<?php
   $p = '/((<)(?(2).*?src=[^>]*>).*?)*?((?:(?:(?:http|https|ftp):'/'/)|(?:www'.))(?:['w'.]+)(?:[,:%#&'/?='w+'.-]+))/smi';
   // multi-line input text
   $str = 'Visit http://www.google.com bla bla <iframe src="http://apple.com">
           </frame> Bellow you can see http://www.ibm.com bla bla';
   preg_match_all($p, $str, $m);
   var_dump( $m[3] );
?>
输出:

array(2) {
  [0]=>
  string(21) "http://www.google.com"
  [1]=>
  string(18) "http://www.ibm.com"
}


建议:

与其将src=""作为提取链接的例外,我认为最好使用以下regex排除<>中包含的所有链接:

$p = '/((<)(?(2)[^>]*>)(?:.*?))*?((?:(?:http|https|ftp):'/'/|www'.).*?[,:%#&'/?='w+'.-]+)/smi';