发布网友 发布时间:2022-04-06 00:33
共3个回答
热心网友 时间:2022-04-06 02:02
$source=你的原字符串。
$source=preg_replace('/(<img(?:(?!onclick)[\s\S])*)onclick\S++((?:(?!src)[\s\S])*src=[\'"]([^\'"]++)[\'"][^>]+>)/','<a href="$3">$1$2</a>',$source);
这个正则替换的要求是增加一部分,删除一部分。
像我上面给你这个答案虽然可以在一行里面替换完成,但是正则式本身会比较复杂,而且默认你的onclick必然在src之前,如果onclick在src之后则无法匹配。
也可以让这个式子再复杂一些,让它可以自动识别onclick和src是否存在,甚至自动适应onclick和src的顺序。
但过于复杂的正则式就不容易维护了。
因此比较好的做法是分两部完成它。
第一步增加a tag
第二步删除onclick
或者反过来也可以。
你可以自己尝试一下分步处理的方案,很简单的。
----------------------------------------------
给你写了一个处理函数,你搭配下面的preg_replace_callback用就是了。
实际上是把分步处理都包含在函数里面了,这样你也比较容易看懂,自己维护起来也方便。
function wrapper($block){
//转存局部变量
$img=$block[0];
//$match[0]为匹配文,$match[1]为其类别,$match[2]为其内容,/S是study模式,如果你需要处理的标签很多,或者你需要处理的文本很大,那么这个S的效率提高会比较明显。
//这里主要是处理alt和src
preg_match_all('/(alt|src)=([\'"][^"\']++[\'"])/S',$img,$match);
//显式声明a tag的链接容器和title容器,不声明也可。
$href=null;
$title=null;
//对刚才获取的内容进行处理,从alt中取出title,从src或onclick中获取href
foreach($match[1] as $key=>$name)
{
switch($name){
case 'alt':
$title='title='.$match[2][$key];
break;
case 'src':
$href='href='.$match[2][$key];
break;
default:
break;
}
}
//这里处理onclick
if(preg_match('/onclick=([^\s>]++)/',$img,$match))
{
//如果之前没有显示声明,这里就应该使用!isset($href)进行判断
if(!$href){$href='href='.$match[1];}
$img=str_replace($match[0],'',$img);
}
//生成a tag并返回变换后的数据
return "<a $title $href>".$img."</a>";
}
$source=preg_replace_callback('/<img[^>]++>/','wrapper',$source);
热心网友 时间:2022-04-06 03:20
回答者“gpgkd906”的方法很好,学习了,我也把较初级的办法贴一下,供大家参考:
<?php
$content='<img style="cursor: pointer" border="0" alt="复地紫城外景" width="550" height="437" onclick="window.open(\'/uploads/allimg/110504/172_110504113610_1.jpg\')" src="/uploads/allimg/110504/172_110504113610_1.jpg" />';
//php中(\S+)要补上一个加号变成两个,即(\S++)
$s2=preg_replace("/(<img[^>]+(?:src=))(\S++)([^>]*>)/iU","<a href=$2>$1 $2 $3</a>",$content);
echo $s2."\r\n\r\n\r\n"; ///输出第一遍出理结果
//1、如果IMG中有ALT标记,则自动给A链接里加一个TITLE标记,其内容用ALT的。
$s2=preg_replace("/(<a[^>]+)(><img[^>]+?)alt=(\S++)([^>]+>)/iU","$1 title=$3$2$4",$s2);
//2、去掉IMG里的onclick标记
$s2=preg_replace("/(<a[^>]+)(><img[^>]+?)(onclick=\S++)([^>]+>)/iU","$1$2$4",$s2);
echo $s2."\r\n\r\n";
?>
热心网友 时间:2022-04-06 04:55
<?php
$content='<img style="cursor: pointer" border="0" alt="复地紫城外景" width="550" height="437" onclick="window.open(\'/uploads/allimg/110504/172_110504113610_1.jpg\')" src="/uploads/allimg/110504/172_110504113610_1.jpg" />';
$replace='<a href="/uploads/allimg/110504/172_110504113610_1.jpg"><img style="cursor: pointer" border="0" alt="复地紫城外景" width="550" height="437" src="/uploads/allimg/110504/172_110504113610_1.jpg" /></a>
';
$result=preg_replace("/<img.*>/iU",$replace,$content);
echo $result;
?>
就这样