あなたのシナリオでは、多くのエッジケースとがが上に追加されなければならない単語があります。私はあなたが古典をしたいと思うが、ダブルブレイクは、新しい段落のthingyを開始しますが、今度は親<div>
(または確かに他のブロック要素)内でも同様です。
私は仕事のほとんどをHTMLパーサーに任せましたが、私はまだテキスト検索を行い、(xpathの次に)置き換えます。だから、あなたが来るのはちょっとハッキリですが、私はかなり安定していると思います。
まず、上記のdivのトップレベルまたは子のすべてのテキストノードを選択します。
(.|./div)/text()
このXPathはDOMDocument
にロードされたとき、それはあなたのHTMLフラグメントのルートタグを表して<body>
タグであるアンカー要素に相対的です。
divの子の場合は、最初の段落を最初に挿入します。
次に、新しい段落を開始するシーケンスの各出現箇所にブレークマーク(ここではコメントの形式)を挿入します(空白の正規化のために"\n\n"
にする必要があります。これは当てはまりません。この作業を透過的に行うには、空白の正規化を先に行う必要があります)。
/* @var $result DOMText[] */
$result = $xp->query('(.|./div)/text()', $anchor);
foreach ($result as $i => $node)
{
if ($node->parentNode->tagName == 'div')
{
$insertBreakMarkBefore($node, true);
}
while (FALSE !== $pos = strpos($node->data, $paragraphSequence))
{
$node = $node->splitText($pos + $paragraphSequenceLength);
$insertBreakMarkBefore($node);
}
}
これらのブレークマークは、HTML <p>
タグに置き換えられます。 HTMLパーサーはそれらを適切な<p>...</p>
ペアに変換します。そのため、私はこのアルゴリズムを書くことができます(これは興味深いかもしれませんが)。これは基本的に私は一度、いくつかの他の回答に概説のように動作しますが、私はちょうどリンクもはや見つけることはありません:、DOMツリーの変更後
- を再び
<body>
のinnterのHTMLを取得します。
"<p>"
とセットマークを交換してください(ここで私はこれが見えるようにするだけでなく、クラスをマーク)
- 適切
<p>...</p>
ペアと再作成DOMに再びパーサにHTMLフラグメントをロードします。
- 最後に、
DOMDocument
パーサからHTMLを再度取得します。
コードでこれらの手順(モーメントの関数定義の一部をスキップする):この示すように
$needle = sprintf('%1$s<!--%2$s-->%1$s', $paragraphSequence, $paragraphComment);
$replace = sprintf("\n<p class=\"%s\">\n", $paragraphComment);
$html = strtr($innerHTML($anchor), array($needle . $needle => $replace, $needle => $replace));
echo "HTML afterwards:\n", $innerHTML($loadHTMLFragment($html));
、ダブル配列は、単一のものと交換されています。おそらく末尾の1つも削除する必要があります(もしapplicaleなら、ここで空白を整えることもできます)。
最終的なHTML出力:素敵な出力フォーマットのため
<div>
<p class="break">
This text should be wrapped in a p tag.
</p>
</div>
<p class="break">
This also should be wrapped.
</p>
<p class="break">
<b>And</b> this.</p>
いくつかのより多くのポストプロダクションも便利です。実際には、アルゴリズムを調整するのに役立つと思うのですが(Full Demo - 空白の正規化はおそらくそこには適用されないので注意して使用してください)。
なぜ 'div'の外のテキストノードも選択したいのであれば、XPath式に' // div'を入れましたか? [このフィドル](http://codepad.org/hzOefCsH)はあなたが望むことをするようだ。 – nwellnhof
私が上に投稿した解決策に何が間違っているか教えていただけますか?改行を含むテキストを複数の段落に変換したいですか? – nwellnhof
@nwellnhof、あなたの解決策は申し訳ありませんが、それは答えではありません。 – Xeoncross