在特定元素之间插入 div

Insert div between specific elements

我之前构建了一些 html 页面,其中有几个段落 div 现在我想将其移动到 WordPress 中以了解主题和 CMS 的结构,但我有一些问题理解。例如,在循环中我不能只在起点添加开头 div 并在结尾添加结尾 div (显然),因为在中间有不同的元素包裹在其他 div。例如,我想拿最后一段,用自定义的 class 围绕它创建一个包装 div,我的解决方案是这样的。我确信这是一个完全混乱的解决方案。我做错了什么?

    // First function       
                function addDivLastP1( $content ) {
                
                $pattern = '/[\s\S]*\K(<p>)/i';
            
     // Here i adding the opening tag div. I close it later in another function
                $replacement = '<div class="my_class">';
                
                $content = preg_replace( $pattern, $replacement, $content );
                return $content;
                }
                
                add_filter( 'the_content', 'addDivLastP1' );
                
                
                
    // Second function
                function addDivLastP2( $content ) {
                
                $pattern = '/[\s\S]*\K(<\/p>)/i';
        
    // Closing div previously open
                $replacement = '</div>';
                
                $content = preg_replace( $pattern, $replacement, $content );
                return $content;
                }
                
                add_filter( 'the_content', 'addDivLastP2' );

用正则表达式解析 HTML(或任何 XML)不是一个好主意。

在你的情况下更好地使用 DOMDocument:

function addDivLastP( $content ) {

$doc = new DOMDocument();
if(!$doc->loadHTML($content)) {
    // cannot parse HTML content
    return $content;
}

for($i = $doc->childNodes->count()-1; $i >= 0; $i--) {
    $child = $doc->childNodes[$i];
    if ($child->nodeName === 'p') { // got last paragraph inside root node
        $div = $doc->createElement('div');
        
        // replace paragraph by new empty div
        $doc->replaceChild($div, $child);

        // insert paragraph inside div
        $div->appendChild($child);
        return $doc->saveHTML();
    }
}

return $content;

}