我有这段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
类处理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>