我需要转换the_content()返回的HTML字符串;在Wordpress中,每个父级元素的数组。例如:
<h3>My subtitle</h3>
<p>Some content here</p>
<blockquote><p>A blockquote goes here</p></blockquote>
会变成:
array['<h3>My subtitle</h3>', '<p>Some content here</p>', '<blockquote> <p>A blockquote goes here</p></blockquote>']
我们想要这样做的原因是在内容中插入广告 - 如果第一段或内容块大于670个字符,则在第一段之后插入广告;如果内容短于该字段,则在第二段之后插入广告。挑战在于,如果这些段落中的任何一个被另一个元素包裹,或者根本不涉及另一个元素。
这是我目前的代码:
$content = apply_filters('the_content', get_the_content());
$content = explode("</p>", $content);
$firstParagraphLength = strlen($content[0]);
if($firstParagraphLength > 670) {
$paragraphAdAfter = 1;
} else {
$paragraphAdAfter = 2;
}
// If this is after the target paragraph, insert ad code first
for ($i = 0; $i <count($content); $i++) {
if ($i == $paragraphAdAfter) { ?>
<!-- AD CODE -->
My ad code goes here, great!
<?php
}
echo $content[$i] . "</p>";
} ?>
这实际上有效,但如果第一段或第二段涉及块引用,则广告将插入到blockquote元素中。数据非常动态,所以我需要找出一种基于父级元素的分割方法,无论它们是块引用,段落,标题等。
答案 0 :(得分:1)
使用DOMDocument
$string = '
<h3>My subtitle</h3>
<p>Some content here</p>
<blockquote><p>A blockquote goes here</p></blockquote>
';
$dom = new DOMDocument;
$dom->loadHTML($string);
foreach($dom->getElementsByTagName('*') as $node)
{
$array[] = $dom->saveHTML($node);
}
print_r($array);
演示网址:
http://sandbox.onlinephpfunctions.com/code/e382a845f121f8c4a56595f075a9b1d9fee2d2de