如何将某些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>
如果您必须使用正则表达式,您只需要通过在.*
之后添加?
来更正您的模式以使其成为非贪婪的:
$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>
我有这个代码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>
如果您必须使用正则表达式,您只需要通过在.*
之后添加?
来更正您的模式以使其成为非贪婪的:
$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>