次のようなサンプル文字列の場合:
<ul>
<li><a href="#">Foo</a></li>
<li><a href="#">Foo</a></li>
<li><a href="#">Foo</a></li>
</ul>
<ul>
<li><a href="#">Bar</a></li>
<li><a href="#">Bar</a></li>
<li><a href="#">Bar</a></li>
</ul>
<ul>
<li><a href="#">Bum</a></li>
<li><a href="#">Bum</a></li>
<li><a href="#">Bum</a></li>
</ul>
<ul>
<li><a href="#">Barf</a></li>
<li><a href="#">Barf</a></li>
<li><a href="#">Barf</a></li>
</ul>
怠惰な数量詞と先読みを使用するTimのpreg_match()
パターンは、完了するまでに432ステップかかります。また、文字列に二重改行シーケンスが実際に存在するという事実にも依存しています(二重改行が存在しない場合は一致しません)。
別のテクニックをお勧めしたいと思います。preg_replace()
はるかに単純な(貪欲な)パターンで文字列に使用します。
コード:(デモ)
preg_replace('/\R{2}.*/s', '', $html)
文字列内で二重改行シーケンスが発生するかどうかに関係なく、目的の出力が返されるだけでなく、パターンはわずか7ステップで実行されます。これは私のプロジェクトで使用するものです。
\R
異なるオペレーティングシステムの改行シーケンスと一致します。
s
sパターン修飾子は、ワイルドカード文字と一致するときに改行文字を含めるように正規表現エンジンに指示します.
。