如何将某些div替换为preg_replace?

How to replace certain div with preg_replace?

我有这个代码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>

提前感谢您的帮助。

您真的不应该尝试使用正则表达式来解析 HTML。相反,使用 DOMDocument class 来处理 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>

Demo on 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>

Demo on 3v4l.org