2
<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>

最初の空白行までコンテンツを取得するにはどうすればよいですか?

注:コンテンツの最初と2番目の部分は、必ずしもulで始まるとは限りません。

4

2 に答える 2

4
preg_match('/\A.*?(?=\s*^\s*$)/smx', $subject, $regs);
$result = $regs[0];

説明

preg_match(
    '/\A    # Start of string
    .*?     # Match any number of characters (as few as possible)
    (?=     # until it is possible to match...
     \s*    #  trailing whitespace, including a linebreak 
     ^      #  Start of line
     \s*    #  optional whitespace
     $      #  End of line
    )       # (End of lookahead assertion)/smx', 
    $subject, $regs);
$result = $regs[0];

空白だけを含む行を空白行として数えると仮定します。そうでない場合は、「オプションの空白」行を削除します。

于 2012-10-16T08:20:22.757 に答える
0

次のようなサンプル文字列の場合:

<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異なるオペレーティングシステムの改行シーケンスと一致します。
ssパターン修飾子は、ワイルドカード文字と一致するときに改行文字を含めるように正規表現エンジンに指示します.

于 2021-07-28T12:04:07.837 に答える