PHP-正则修改某div下的img的class并在其外层添加一个div
例如,有这么个字符串:
$image = '<div id="body">
<span id="msg">ssdfsdf</span>
<div id="mail">32987iu@ss.com</div>
<img alt="test" title="test" src="./test.jpg" id="logo" />
</div>';
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
下了个dom解析类,实现了我想要的效果:
<?php
include('./simple_html_dom.php');//下载地址http://sourceforge.net/projects/simplehtmldom/files/latest/download?source=files
$image = <<<HTML
<div id="body" class="sdf">
<img alt="test" title="test" src="./test.jpg" id="logo" class="abc"/>
<span id="msg">ssdfsdf</span>
<div id="mail">32987iu@ss.com</div>
<img alt="test" title="test" src="./test.jpg" id="logo" class="abc"/>
<img alt="ab" title="test" src="./test.jpg" id="logo" class="123"/>
<img src="xxx"/>
<div id="mailss">32yuyiu@ss.com</div>
</div>
<img src="yyy" />
<div id="other">
<img src="xxx" />
</div>
HTML;
$html = str_get_html($image);
foreach($html->find('div#body img') as $e)
if(false===$e->class) $e->class = 'addClass';
echo $html;
?>
修改之后:
**<div id="body" class="sdf">** <img alt="test" title="test" src="./test.jpg" id="logo" class="abc"/> <span id="msg">ssdfsdf</span> <div id="mail">32987iu@ss.com</div> <img alt="test" title="test" src="./test.jpg" id="logo" class="abc"/> <img alt="ab" title="test" src="./test.jpg" id="logo" class="123"/> <img src="xxx" class="addClass"/> <div id="mailss">32yuyiu@ss.com</div> **</div>** <img src="yyy" /> <div id="other"> <img src="xxx" /> </div>
给你写了一个完整版的,经测试多遍,应该没什么问题了
$image = '<div id="body"><img alt="test" title="test" src="./test.jpg" id="logo" class="addClass"/><span id="msg">ssdfsdf</span><div id="mail">32987iu@ss.com</div><div></div><div></div><img alt="test" title="test" src="./test.jpg" id="logo" class="abc addClass"/><img alt="ab" title="test" src="./test.jpg" id="logo" class="123"/><img src="xxx"/></div><div id="other"><img src="xxx" /></div><div id="body"><span id="msg">ssdfsdf</span><div id="mail">ff@ss.com</div><img alt="test" title="test" src="xxxx" id="logo1"/></div>';
$pattern = " #(<divsid="body".*?>.*?<img .*s*/?>.*?</div>|<!--[^-]*-->) #is";
preg_match_all($pattern,$image,$arr);
if(isset($arr[0]) && !empty($arr[0])){
foreach($arr[0] as &$val){
preg_match_all("/<imgs+[^>]+>/", $val, $images);
if(isset($images[0]) && !empty($images[0])){
foreach($images[0] as $k => $img){
if(preg_match("/(classs?=['"].*?addClass.*['"])/i", $img, $has_class)){
$image = str_replace($images[0][$k], '<div id="logoDiv">'.$img . '</div>', $image);
if($has_class) continue;
}
if(!preg_match("/classs?=['"](.*)['"]/i", $img, $class)){
$img = preg_replace("/(?=/>)/"," class="addClass"",$img);
}else{
$img = preg_replace("/classs?=['"](.*)['"]/i","class="$1 addClass"",$img);
}
$image = str_replace($images[0][$k], '<div id="logoDiv">'.$img . '</div>', $image);
}
}
}
}
var_dump($image);
这不是一个完美的答案,但是比较快速有效,通过观察特殊之处,一般能在几分钟内解决问题。
使用vi/vim, 进入命令行:
1,$ s/<div id="body">(.)<img (.)/>(.*)</div>';/<div id="body"1<img class="addClass" 2/></div>';3/g
此命令未检查addClass 重复,需要再写一个替换命令。
$image = '<div id="body"><span id="msg">ssdfsdf</span><div id="mail">32987iu@ss.com</div><img alt="test" title="test" src="./test.jpg" id="logo" class="123"/><img src="xxx"/></div><div id="other"><img src="xxx" /></div><div id="body"><span id="msg">ssdfsdf</span><div id="mail">32987iu@ss.com</div><img alt="test" title="test" src="xxxx" id="logo1"/></div>';
preg_match_all("/<divs+ids?=["']body["']s?>(.*?</div>){2}/i",$image,$arr);
if(isset($arr[0][0]) && !empty($arr[0][0])) {
$temp = array();
foreach($arr[0] as $val) {
$temp[] = preg_replace_callback("/<img [^>]+>/","my_replace",$val);
}
$image = str_replace($arr[0],$temp,$image);
echo $image;
}
function my_replace($m) {
$m[0] = !preg_match("/(classs?=.*?)/i",$m[0]) ? preg_replace("/(?=/>)/"," class="addClass"",$m[0]) : $m[0];
return "<div>{$m[0]}</div>";
}