所以我得到了以下HTML代码:
[et_pb_section admin_label="section"]
<h2>abcdefghijkl - abcdefghijklmno</h2>
<p> </p>
<p>abcdefghi<strong> abcdefghijkl</strong> abcdefghijklmnopqrstuvxyz.</p>
<p><br /><br /><span style="text-decoration: underline;"><strong>abcdefghij</strong></span></p>
<p><br />abcdefghijklmnopqrstuvxyz.<br /> <br /><br />
<span style="text-decoration: underline;"><strong>abcdefghi</strong>
</span></p>
<p><br />abcdefghijklmano</p>
<br /><br />
<div id="termine">
<div>
<strong>abcdefghikla - 12345678</strong>
<p>
<a href="/just-another-url.html">abcdefghijklmnopqrst <br />
abcdefghijklmnopqrst >>></a>
</p>
</div>
</div>
</div>
我想用另一段代码</div>
替换最后一个结尾[/et_pb_section]
。
所以我尝试了许多在线正则表达式测试人员中的一个并且用这个
进行了测试 {p>$content= preg_replace("/<\/div>$/", $et_pb_section_ENDTAG, $content);
$et_pb_section_ENDTAG
$et_pb_section_ENDTAG='[/et_pb_section]';
。
使用在线测试仪时,一切正常,最后</div>
被替换,但在我的php脚本中,它无效。没有任何反应,没有错误,没有任何结果HTML代码保持不变。我在这里做错了什么?
谢谢。
编辑:哦,我差点忘了,当我摆脱$并使用RegEx OptionD
(仅在字符串的末尾匹配)时,所有三个结束</div>
都被替换。所以我想$
有问题
答案 0 :(得分:1)
使用DOMDocument
,DOMXPath
和DOMDocumentFragment
的示例,将第一个div标记替换为&#34; admin_label&#34;属性值为#34; section&#34; (随意适应您的实际需求):
$html = <<<'EOD'
<div admin_label="section">
<p>abdefghij</p>
<p>klmnopqrs</p>
<p>tuvwxyz01</p>
<ul>
<li>2345</li>
<li>6789</li>
</ul>
</div>
EOD;
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DOMXPath($dom);
$divNode = $xp->query('(//div[@admin_label="section"])[1]')->item(0);
$open = $dom->createTextNode('[et_pb_section admin_label="section"]');
$close = $dom->createTextNode('[/et_pb_section]');
$fragment = $dom->createDocumentFragment();
$fragment->appendChild($open);
foreach ($divNode->childNodes as $childNode) {
$fragment->appendChild($childNode->cloneNode(true));
}
$fragment->appendChild($close);
$divNode->parentNode->replaceChild($fragment, $divNode);
echo $dom->saveHTML();
libxml_clear_errors();
注意:在现实生活中,您需要检查XPath查询是否在继续之前返回一些内容。