根据父级元素

时间:2015-12-31 17:51:39

标签: php wordpress

我需要转换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元素中。数据非常动态,所以我需要找出一种基于父级元素的分割方法,无论它们是块引用,段落,标题等。

1 个答案:

答案 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