Я думаю, что лучше всего использовать preg_replace_callback
.
Также я бы порекомендовал немного более строгий regexp
, чем те, которые предлагались до сих пор - что если ваша страница содержит тег <img />
, который не содержит атрибут id
?
$page = '
<body>
<img src="source.jpg" />
<p>
<img src="source.jpg" id ="hello" alt="nothing" />
<img src="source.jpg" id ="world"/>
</p>
</body>';
function my_callback($matches)
{
static $i = 0;
return $matches[1]."img_".$i++;
}
print preg_replace_callback('/(<img[^>]*id\s*=\s*")([^"]*)/', "my_callback", $page);
Что производит для меня следующее:
<body>
<img src="source.jpg" />
<p>
<img src="source.jpg" id ="img_0" alt="nothing" />
<img src="source.jpg" id ="img_1"/>
</p>
</body>
У regexp
есть две группы захвата: первую мы сохраняем, а другую заменяем. Я использовал множество классов отрицательных символов (например, [^>]*
= до закрытия >
), чтобы убедиться, что <img />
теги не требуют , чтобы иметь id
атрибуты.