<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*
負の後読みアサーションが使用されている場合、正規表現で空白 ( ) が完全に無視される理由を誰かが説明できますか?
さらに重要なことは、前述の目標を達成するために他に何を試すことができるかということです。