你好,我有以下代码:
$content1 = '<img src="image1.png" class="image1"><img src="image2.png"><img src="image3.png" class="image3">';
当我使用此代码时:
preg_replace('~<img\s*.*?\s*class\s*=\s*"([^"]*)"\s*.*?>~i','<img src="image-replaced" class="$1">', $content1);
这就是我得到的:
<img src="image-replaced" class="image1"><img src="image-replaced" class="image3">
正如您所看到的那样<img src="image2.png">
被忽略了,因为它没有类属性,所以它没有被替换。
现在我想做的是img标签如果没有class属性,那么它会被替换,如果没有,那么替换它并保持类空白如下:
<img src="image2.png" class="">
感谢您的任何帮助。
答案 0 :(得分:4)
您可以考虑使用DOM代替使用正则表达式。
$doc = new DOMDocument;
@$doc->loadHTML($content1); // load the HTML data
$imgs = $doc->getElementsByTagName('img');
foreach ($imgs as $img) {
if ($img->hasAttribute('class')) {
$img->setAttribute('src', 'image-replaced');
} else {
## Otherwise set an empty class if you desire.
$img->setAttribute('class', '');
}
}
如果你必须使用正则表达式,我会考虑使用回调:
$str = preg_replace_callback('~<img src="([^"]*)"(?: class="([^"]*)")?>~i',
function($m) {
return '<img src="'.(isset($m[2])?'image-replaced':$m[1]).'" class="'.($m[2]?:'').'">';
}, $str);
答案 1 :(得分:0)
你不能只替换src
属性的内容,并保持课程和其他内容不受影响
preg_replace('/src=\"[^\"]+\"/', 'src="image-replaced.png"', '<img src="image1.png" class="image1"><img src="image2.png"><img src="image3.png" class="image3">');
https://regex101.com/r/hR9iH0/1
如果img标签中有class属性,那么如果没有,则替换它然后替换它并保持类空白如下:
让我帮助你们,
如果图像标签有一个类,则替换src。 如果图像没有类,则替换src并将该类留空,
拥有class=""
且没有课程是相同的。