3

ユーザーに tinymce HTML エディターを提供するアプリケーションを作成しています。私が直面している問題は、ヘッダーをフォーマットするために「Heading 2」(h2)スタイルを使用するようにユーザーに何度も依頼しているにもかかわらず、ユーザーは h1 を使用している(私は対処できます!)か、新しい段落を使用しているということです。 、次にコンテンツの段落を太字にします。

すなわち

<p><strong>This is a header</strong></p>
<p>Content content blah blah blah.</p>

私がやりたいことは<p><strong>、8 語未満の単語を含む のすべてのインスタンスを見つけて、それらを h2 に置き換えることです。

これを行う最善の方法は何ですか?

更新: Jack のコードのおかげで、ここで説明したことすべてを実行する単純なモジュールに取り組みました。コードは GitHub にあります

4

3 に答える 3

2

これに使えますDOMDocument<strong>の子であるタグを見つけ、<p>単語数を数え、ノードと親を<h2>に置き換えます。

$content = <<<'EOM'
<p><strong>This is a header</strong></p>
<p>Content content blah blah blah.</p>
EOM;

$doc = new DOMDocument;
$doc->loadHTML($content);
$xp = new DOMXPath($doc);


foreach ($xp->query('//p/strong') as $node) {
        $parent = $node->parentNode;
        if ($parent->textContent == $node->textContent && 
                str_word_count($node->textContent) <= 8) {
            $header = $doc->createElement('h2', $node->textContent);
            $parent->parentNode->replaceChild($header, $parent);
        }
}

echo $doc->saveHTML();
于 2013-04-17T03:58:57.887 に答える
0

これは私が取り組んだコードです。

<?php

$content_old = <<<'EOM'
<p>&nbsp; </p>
<p>lol<strong>test</strong></p>
<p><strong>This is a header</strong></p>
<p>Content content blah blah blah.</p>
EOM;

$content = preg_replace("/<p[^>]*>[\s|&nbsp;]*<\/p>/", '', $content_old);

$doc = new DOMDocument;
$doc->loadHTML($content);
$xp = new DOMXPath($doc);

foreach ($xp->query('//p/strong') as $node) {
    $parent = $node->parentNode;
    if ($parent->textContent == $node->textContent && 
            str_word_count($node->textContent) <= 8) {
        $header = $doc->createElement('h2');
        $parent->parentNode->replaceChild($header, $parent);
        $header->appendChild($doc->createTextNode( $node->textContent ));
    }
}

// just using saveXML() is not good enough, because it adds random html tags
$xp = new DOMXPath($doc);
$everything = $xp->query("body/*"); // retrieves all elements inside body tag
$output = '';
if ($everything->length > 0) { // check if it retrieved anything in there
    foreach ($everything as $thing) {
        $output .= $doc->saveXML($thing) . "\n";
    }
};

echo "--- ORIGINAL --\n\n";
echo $content_old;
echo "\n\n--- UPDATED ---\n\n";
echo $output;

スクリプトを実行すると、次のような出力が得られます。

--- ORIGINAL --

<p>&nbsp; </p>
<p>lol<strong>test</strong></p>
<p><strong>This is a header</strong></p>
<p>Content content blah blah blah.</p>

--- UPDATED ---

<p>lol<strong>test</strong></p>
<h2>This is a header</h2>
<p>Content content blah blah blah.</p>

更新 #1

タグ内に他の<p><strong>タグ (たとえば、<p><strong><a>) がある場合、全体<p>が置き換えられることは何の価値もありませんが、これは私の意図ではありませんでした。

これは、if を次のように変更することで簡単に修正できます。

        if ($parent->textContent == $node->textContent &&
                str_word_count($node->textContent) <= 8 &&
                $node->childNodes->item(0)->nodeType == XML_TEXT_NODE) {

アップデート #2

元の createElement は、エスケープする<p><strong>必要のある HTML 文字 (たとえば&) 内のコンテンツが含まれている場合に問題を引き起こすことにも注意してください。

古いコードは次のとおりです。

        $header = $doc->createElement('h2', $node->textContent);
        $parent->parentNode->replaceChild($header, $parent);

新しいコード (正しく動作します) は次のとおりです。

        $header = $doc->createElement('h2');
        $parent->parentNode->replaceChild($header, $parent);
        $header->appendChild($doc->createTextNode( $node->textContent ));
于 2013-04-17T06:12:06.860 に答える
0

あなたは PHP に習熟しているように見えるので、PHP Simple HTML Dom Parserはこのタスクに対して非常に直感的であることに気付くかもしれません。リクエストしている要素を見つけた後にタグ名を変更する非常に簡単な方法を紹介するドキュメントのスニペットを次に示します。

$html = str_get_html("<div>foo <b>bar</b></div>");
$e = $html->find("div", 0);

echo $e->tag; // Returns: " div"
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $e->innertext; // Returns: " foo <b>bar</b>"
echo $e->plaintext; // Returns: " foo bar"

Attribute Name  Usage
$e->tag     Read or write the tag name of element.
$e->outertext   Read or write the outer HTML text of element.
$e->innertext   Read or write the inner HTML text of element.
$e->plaintext   Read or write the plain text of element.
于 2013-04-17T03:34:56.837 に答える