RegEx& PHP:上次使用$,仅适用于在线测试人员

时间:2016-01-22 21:40:23

标签: php html regex

所以我得到了以下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 Option D(仅在字符串的末尾匹配)时,所有三个结束</div>都被替换。所以我想$

有问题

1 个答案:

答案 0 :(得分:1)

使用DOMDocumentDOMXPathDOMDocumentFragment的示例,将第一个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查询是否在继续之前返回一些内容。