使用php降低字符串中的标题标签(将h1转换为h2,h2转换为h3递归)

时间:2012-06-13 08:42:42

标签: php html xml parsing domdocument

我知道我们可以通过将字符串加载到

来获得标题

$doc = DOMDocument::loadXML($xml_str);

然后像这样得到H1标签:

$list = $doc->getElementsByTagName("h1");
for ($i = 0; $i < $list->length; $i++) {
   print($list->item($i)->nodeValue . "<br/>\n");
}

如果我想将这些H1更改为H2s,我有点迷失。我已经读过appendChild(),但这会让事情变得非常混乱。有没有办法递归降级包含html的字符串中的标题标签?该方法将接受以下参数:

function demoteHeadings($xml_string, $top_level='H2'){
   //if string's highest heading is more than $top_level,
   //we demote all headings in this html by 1 level. i.e. if
   //h1 is found, all h1s, h2s and so on are demoted one level -
   //and we recursively    call this function again;
   if($top_level_in_xml > $top_level) demoteHeadings($output, $top_level);
}

我希望我有道理。我想要实现的是自动解析我的客户在CMS中输入的标题......当标题已经是h1时,他们在文章中使用H1。有时,还有一个页面标题是一个h1,它真的搞砸了整个页面上的结构。

3 个答案:

答案 0 :(得分:1)

使用str_ireplace()

会不会更简单
$content = str_ireplace(array('<h1>','</h1>'),array('<h2>','</h2>'),$input);

答案 1 :(得分:0)

由于物品将放在更深的容器中,因此对它们进行适当的样式应该不是问题。但是我知道你已经考虑过了

我会被告知建议使用正则表达式解析HTML ...但是因为你的客户端正在输入带有CMS的HTML,我收集输入的语法非常可靠且元素没有属性,所以为什么不简单地str_replace ?

啊,劳伦斯打败了我

答案 2 :(得分:0)

str_ireplace解决方案的另一个变体,但更加健壮(考虑到h1到h100)

function demoteHtmlHeaderTags($html)
{
        $originalHeaderTags = [];
        $demotedHeaderTags = [];

        foreach(range(100, 1) as $index)
        {
            $originalHeaderTags[] = '<h' . $index .'>';

            $originalHeaderTags[] = '</h' . $index . '>';

            $demotedHeaderTags[] = '<h' . ($index + 1) . '>';

            $demotedHeaderTags[] = '</h' . ($index + 1) . '>';
        }

        return str_ireplace($originalHeaderTags, $demotedHeaderTags, $html);
}