Php:当使用正则表达式在html中存在多个img标记时,如何用不同的不同内容替换src

时间:2016-01-26 06:28:27

标签: php html regex

我从ckeditor获取html内容,我有以下html内容

<p><strong>Hello</strong></p>
<p><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAMACAIAA" style="height:131px; width:234px" /></p>
<p><strong>How are you</strong></p>
<p><img alt="" src="data:image/png;base64,ABAXKuVAAAAA3NCSVQICAjb4U/gAAAgAElEQV" style="height:142px; width:253px" /></p>
<p><strong>Good Morning</strong></p>
<p>&nbsp;</p>

现在我想用不同的图像名称替换每个图像标记的src。比如说

<p><strong>Hello</strong></p>
<p><img alt="" src="img.jpg" style="height:131px; width:234px" /></p>
<p><strong>How are you</strong></p>
<p><img alt="" src="test.jpg" style="height:142px; width:253px" /></p>
<p><strong>Good Morning</strong></p>
<p>&nbsp;</p>

图像源是动态绑定的。所以它可以是任何东西。在这个替换后我将这个html内容保存到数据库。

我已经完成了

$image_name ='<p><strong>Hello</strong></p>
    <p><img alt="" src="img.jpg" style="height:131px; width:234px" /></p>
    <p><strong>How are you</strong></p>
    <p><img alt="" src="test.jpg" style="height:142px; width:253px" /></p>
    <p><strong>Good Morning</strong></p>
    <p>&nbsp;</p>';
    $html = preg_replace('!(?<=src\=\").+(?=\"(\s|\/\>))!', 'img.jpg',$image_name );

但这会替换所有src相同。

除了src标记的<img>之外,我希望整个内容相同。我需要使用正则表达式替换此内容。我更喜欢正则表达式,因为我想将这个被替换的html保存到数据库中。如果任何其他解决方案有效,那么这也很好。

1 个答案:

答案 0 :(得分:4)

我已经使用DOM解析器作为评论中给出的建议。以下是我的

$image_name = '<p><strong>Hello</strong></p>
<p><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAMACAIAA" style="height:131px; width:234px" /></p>
<p><strong>How are you</strong></p>
<p><img alt="" src="data:image/png;base64,ABAXKuVAAAAA3NCSVQICAjb4U/gAAAgAElEQV" style="height:142px; width:253px" /></p>
<p><strong>Good Morning</strong></p>
<p>&nbsp;</p>';

$doc = new DOMDocument();
$doc->loadHTML($image_name);
$img_tags = $doc->getElementsByTagName('img');

$i=0;
foreach ($img_tags as $t )
{
    $savepath = 'img_'.$i.'jpg';
    $t->setAttribute('src',$savepath);
    $i++;
}
$cont = $doc->saveHTML();

这给了我正确的结果。