PHP preg_replace忽略不存在的类属性


php preg_replace ignore class attribute if not exist

你好,我有以下代码:

$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">被忽略了,因为它没有class属性,所以它没有被替换。
现在我要做的是如果img标签中有class属性那么它会被替换如果没有那么替换它并保持class为空,像这样:

<img src="image2.png" class="">

感谢你的帮助。

您可以考虑使用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);

eval.in

你能不能只替换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属性,则替换它;如果没有,则替换它,并保持class为空,像这样:

让我来帮你们,

如果图像标签有一个类,请替换src。如果图像没有类,则替换src并保留类空白,

class=""和没有class是一回事