正则表达式和PHP:最后一次出现与$,仅在在线测试中工作


RegEx & PHP: last appearance with $ , only working in online tester

所以我得到了以下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>

我想用另一段代码[/et_pb_section]替换最后一个结束</div>.

所以我在众多在线正则表达式测试器之一中尝试过,并对此进行了交流

$content= preg_replace("/<'/div>$/", $et_pb_section_ENDTAG, $content); $et_pb_section_ENDTAG所在的地方 $et_pb_section_ENDTAG='[/et_pb_section]'; .

使用在线测试器时,一切正常,最后一个</div>被替换,但在我的 php 脚本中它不起作用。 什么都没有发生,没有错误,什么都没有。HTML 代码保持不变。我在这里做错了什么?

谢谢。

编辑:哦,我差点忘了,当我摆脱$并使用正则表达式选项D(仅在字符串末尾匹配)时,所有三个关闭</div>都被替换。所以我想$有问题

一个包含 DOMDocumentDOMXPathDOMDocumentFragment 的示例,它将第一个div 标签替换为值 "section" 的 "admin_label" 属性(随意适应您的实际需求):

$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 查询是否返回某些内容。