1

私は以下のようなHTML文字列を持っています:

$string = "\n<h2>heading 2</h2>\n\nwhatever we are doing is good to have one thing\n<h3>heading 3</h3>\nnext paragraph goes there\n<h2>new heading 2</h2>\n\npara succeeded for new heading 2\n\n<h2>heading 3</h2>\nand the rest of data";

見出しのテキスト(つまり、<h2>タグと</ h2>タグ内)とそれに続くテキスト(別の<h2>が見つかるまで)または文字列の終わりが必要です

私は次のようなことを試しました:

$pattern = "/<h2>((?:(?!(<\/h2>)).)*)<\/h2>(.*?)(<h2>)?/is";

しかし、これは望ましい結果をもたらしていません。

私は次のように取得したい:

Array
(
[0] => Array
    (
        [0] => <h2>heading 2</h2>
        [1] => <h2>new heading 2</h2>
        [2] => <h2>heading 3</h2>
    )

[1] => Array
    (
        [0] => heading 2
        [1] => new heading 2
        [2] => heading 3
    )

[2] => Array
    (
        [0] => whatever we are doing is good to have one thing\n&lt;h3&gt; heading 3&lt;h3&gt;/h3&lt;h3&gt;\nnext paragraph goes there
        [1] => para succeeded for new heading 2
        [2] => and the rest of data
    )
)
4

1 に答える 1

2

このようにしてみてください

preg_match_all('#<h2>(.*)</h2>([^<]*+)#isU', $string, $match);
echo '<pre>' . htmlspecialchars(print_r($match, 1)) . '</pre>';

または多分あなたが必要とするこのように

preg_match_all('#<h2>(.*)</h2>((?:(?!<h2>).)*+)#isU', $string, $match);

最適化されたバージョン

$pattern = '#<h2>(.*)</h2>(.*)(?=(?:<h2>|$))#isU';
于 2013-02-25T10:29:00.543 に答える