3

文字列を

$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 を H2 に変更したい場合、少し迷っています。について読んだことがあります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 が含まれていることもあり、ページ全体の構造がめちゃくちゃになってしまいます。

4

4 に答える 4

1

str_ireplace()を使用する方が簡単ではないでしょうか

$content = str_ireplace(array('<h1>','</h1>'),array('<h2>','</h2>'),$input);
于 2012-06-13T08:52:33.707 に答える
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);
}
于 2014-10-10T09:14:39.617 に答える
0

記事はより深いコンテナーに格納されるため、適切にスタイルを設定することは問題になりません。しかし、あなたはすでにそれを考えていると思います

HTMLを解析するために正規表現を提案することで私は言われます...しかし、あなたのクライアントはCMSでHTMLを入力しているので、入力の構文は非常に信頼性が高く、要素には属性がないので、単純にstr_replaceしないのはなぜですか?

ああ、ローレンスは私を打ち負かしました

于 2012-06-13T08:55:56.470 に答える