如果不存在,php preg_replace忽略类属性

时间:2015-07-24 23:00:38

标签: php regex preg-replace preg-match

你好,我有以下代码:

$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="">

感谢您的任何帮助。

2 个答案:

答案 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);

eval.in

答案 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=""且没有课程是相同的。