在特定元素之间插入 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;
}
我之前构建了一些 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;
}