Как заменить определенный div на preg_replace? - PullRequest
1 голос
/ 04 октября 2019

У меня есть этот код HTML:

<div class="wrap">
<div class="wp-checkbox" data-value="zf">content</div>
<div class="wp-checkbox" data-value="tdp">content</div>
</div>

Я хотел бы заменить содержимое этих элементов div, но каждый по-своему.

Я пытался сделать это кодом:

$pattern = '/=\"zf\">.*<\/div>/';
$pattern2 = '/=\"tdp\">.*<\/div>/';
$html = preg_replace( $pattern, '="zf">new content of div</div>', $html );
$html = preg_replace( $pattern2, '="tdp">new content of another div</div>', $html );

Но есть проблема в том, что этот код заменил все мои div, и я получаю это:

<div class="wrap">
<div class="wp-checkbox" data-value="zf">new content of div</div>
</div>

Как я могу изменить эти div по одному? Как я могу показать в шаблоне, что я хочу изменить только до первого закрытия </div> (не до последнего)?

Я хотел бы получить этот результат:

<div class="wrap">
<div class="wp-checkbox" data-value="zf">new content of div</div>
<div class="wp-checkbox" data-value="tdp">new content of div</div>
</div>

Заранее благодарю за помощь.

1 Ответ

1 голос
/ 04 октября 2019

Вы действительно не должны пытаться использовать регулярные выражения для анализа HTML. Вместо этого используйте класс DOMDocument для обработки HTML:

$doc = new DOMDocument();
$doc->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
$div = $xpath->query('//div[@data-value="zf"]')[0];
$div->nodeValue = "new content of div";
$div = $xpath->query('//div[@data-value="tdp"]')[0];
$div->nodeValue = "new content of another div";
echo $doc->saveHTML();

Вывод:

<div class="wrap">
<div class="wp-checkbox" data-value="zf">new content of div</div>
<div class="wp-checkbox" data-value="tdp">new content of another div</div>
</div>

Демонстрация на 3v4l.org

Если вы должны использовать регулярное выражение, вам просто нужно исправить ваши шаблоны, чтобы сделать их нежадными, добавив ? после .*:

$pattern = '/=\"zf\">.*?<\/div>/';
$pattern2 = '/=\"tdp\">.*?<\/div>/';
$html = preg_replace( $pattern, '="zf">new content of div</div>', $html );
$html = preg_replace( $pattern2, '="tdp">new content of another div</div>', $html );

Вывод:

<div class="wrap">
<div class="wp-checkbox" data-value="zf">new content of div</div>
<div class="wp-checkbox" data-value="tdp">new content of another div</div>
</div>

Демо на 3v4l.org

...