3

preg_match_all を使用して Web サイトから特定のセクションの出現を取得しようとしていますが、以前はこれを成功させましたが、現在の違いは、セクションが改行にまたがっていることです...私が理解しているように、私はいくつかの修飾子でこれを行うことができるはずです...

したがって、問題のサイトのセクションの構造は次のようになります。

<div id="LICRabatGuideAftale">
    <something in between>
    <div class="clear"></div>
</div>

<div id="LICRabatGuideAftale">
    <something in between>
    <div class="clear"></div>
</div>

<div id="LICRabatGuideAftale">
    <something in between>
    <div class="clear"></div>
</div>

だから私はLICRabatGuideAftaleとクリアですべての出現を取得しようとしています...

私は試してみました:

preg_match_all ("/LICRabatGuideAftale(.*)clear/s", $link_section, $link_array);

サイトをセクションに分割しているようには見えませんが、配列に1つのエントリしかありません...

4

3 に答える 3

3

.*?の代わりに使用し.*ます。は?量指定子を貪欲ではなく消極的にするため、一致は最後ではなく最初で停止します。 clear

U他の回答で提案されているように修飾子を使用することも可能です。これは基本的に の動作を反転させ.*.*?それぞれ消極的で貪欲にします。

于 2013-03-29T21:19:33.427 に答える
2

問題は間違いなく .* 対 .*? にありました。
.* はデフォルトで貪欲です。

どうぞ:

preg_match_all ("/LICRabatGuideAftale(.*?)clear/s", $link_section, $link_array);

foreach($link_array[1] as $match) {
    // Clean up scraps
    $data = preg_replace('/">\n\s*|\n\s*<div class="/', "", $match);
    echo $data;
}

出力:

 - <something in between>
 - <something in between>
 - <something in between>
于 2013-03-29T21:26:51.130 に答える
2

U オプションで非貪欲にします。

preg_match_all ("`YOUR_REGEX`U", …);

ほとんどの場合、私は以下を使用します:

preg_match_all ("`YOUR_REGEX`Uis", …);

これにより、貪欲ではなく、大文字と小文字が区別されません。 興味がある場合に備えて、php.net
のすべてのパターン修飾子を次に示します。

php.netからの引用:

U (PCRE_UNGREEDY)
この修飾子は量指定子の「貪欲さ」を反転させて、デフォルトでは貪欲にならないようにしますが、? が続くと貪欲になります。Perl とは互換性がありません。また、パターン内の (?U) 修飾子の設定、または量指定子の後ろの疑問符 (.*? など) によって設定することもできます。

于 2013-03-29T21:20:33.620 に答える