Я хочу, чтобы заменить содержимое элемента с содержимым, которое definded в $ tagsReplace массиве, но есть проблема с preg_replace, моя текущая одой:Как заменить значение внутри тега html?
$tagsReplace = array(
'header' => 'header',
'tag1' => 'this is tag1',
'tag2' => 'this is tag2',
'tag3' => 'this is tag3',
'footer' => 'footer',
);
$content = '
<!DOCTYPE html>
<hthml>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);
foreach ($xpath->query('//*[@data-edit="true"]') as $rowNode) {
$tagID = $rowNode->getAttribute('data-tag-id');
$content = preg_replace('/(<div.*?data-edit="true"[^>]*>)(.*?)(<\/div>)/i', '$1'. $tagsReplace[$tagID] . '$3', $content);
}
echo $content;
Что я хочу, чтобы получить выход так:
<!DOCTYPE html>
<hthml>
<header data-edit="true" data-tag-id="header">header</header>
<div data-edit="true" data-tag-id="tag1">this is tag1</div>
<div data-edit="true" data-tag-id="tag2">this is tag2</div>
<div data-edit="true" data-tag-id="tag3">this is tag3</div>
<footer data-edit="true" data-tag-id="footer">footer</footer>
</html>
Текущий результат:
<!DOCTYPE html>
<hthml>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1">footer</div>
<div data-edit="true" data-tag-id="tag2">footer</div>
<div data-edit="true" data-tag-id="tag3">footer</div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
Soo все элементы, которые содержат atribute данных редактируемых = «истинный» и данных мечения-идентификатор, чтобы получить содержимое внутри m заменяется значением tagid, которое дефинируется в arra $ tagsReplace.
Вы по-прежнему собираете все 3 divs с одинаковым значением, потому что вы не назвали идентификатор тега данных в регулярном выражении. –
Вы запустили код? результат похож на него. –
Извинения. Я не заметил, что вы взорвали его в разные строки, а затем выполняли регулярное выражение по каждой линии в отдельности. Поэтому вы правы в том, что он работает с этими точными данными. Однако, что произойдет, если вы представите что-то простое, как пустая строка перед одним из divs - ничего не синхронизировать $ i и $ rowNode в синхронизации ... –