如何用preg_replace替换某些div?

问题描述 投票:0回答:1

我有这段HT​​ML代码:

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

感谢您的帮助。

php preg-replace
1个回答
1
投票

您确实不应该尝试使用正则表达式来解析HTML。而是使用DOMDocument类处理HTML:

DOMDocument

输出:

$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>

© www.soinside.com 2019 - 2024. All rights reserved.