-1

<p>HTML フラグメント内の各リスト要素を囲むタグを挿入する必要があります。これにより、ネストされた段落が作成されてはなりません。そのため、先読み/後読みアサーションを使用して、コンテンツが既に段落タグで囲まれているかどうかを検出したいと考えています。

これまでのところ、次のコードを思いつきました。

この例では、負の後読みアサーションを使用して、終了タグと任意の空白が前にない</li>各終了タグに一致させます。</p>

$html = <<<EOF
<ul>
        <li>foo</li>
        <li><p>fooooo</p></li>
        <li class="bar"><p class="xy">fooooo</p></li>
        <li>   <p>   fooooo   </p>   </li>
</ul>
EOF;
$html = preg_replace('@(<li[^>]*>)(?!\s*<p)@i', '\1<p>', $html);
$html = preg_replace("@(?<!</p>)(\s*</li>)@i", '</p>\1', $html);
echo $html, PHP_EOL;

驚いたことに、次の出力が得られます。

<ul>
    <li><p>foo</p></li>
    <li><p>fooooo</p></li>
    <li class="bar"><p class="xy">fooooo</p></li>
    <li>   <p>   fooooo   </p> </p>  </li>
</ul>

開始タグの挿入は期待どおりに機能しますが、最後のリスト要素に追加のタグが挿入されていることに注意してください!</p>

\s*負の後読みアサーションが使用されている場合、正規表現で空白 ( ) が完全に無視される理由を誰かが説明できますか?

さらに重要なことは、前述の目標を達成するために他に何を試すことができるかということです。

4

3 に答える 3

1

あなたはこれを持っています:

</p>   </li>

そして、あなたの正規表現はここでは一致しません:

</p>   </li>
    ^

</p>直前があるからです。しかし、ここでは一致します:

</p>   </li>
     ^

というのは、前のテキストは ではなく</p>であるからです。

HTMLパーサーが必要です。PHP にはいくつか付属していますが、私はあまり PHP 開発者ではないので、特にお勧めすることはできません。いくつかの推奨事項については、この質問を参照してください。

于 2013-10-28T22:38:25.363 に答える
0

これは役立つかもしれません。

$html = preg_replace('@(<li[^>]*>)([^</li>]+)(?!\s*<p)@i', '$1<p>$2</p>', $html);
于 2013-10-28T23:33:31.890 に答える