我知道我们可以通过将字符串加载到
来获得标题 $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,它真的搞砸了整个页面上的结构。
答案 0 :(得分:1)
$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);
}