• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現)

PHPの正規表現で特定の文字列を含む親のdivタグを抽出する方法

このQ&Aのポイント
  • PHPの正規表現を使用して、特定の文字列を含む親のdivタグを抽出する方法について教えてください。
  • 現在、正規表現のパターンを試していますが、全てのdivタグが取得されてしまう問題が発生しています。
  • 「正解」となるような正規表現パターンを教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

お書きの表現で何が悪いかと言えば、「.*」の部分です。 「.*」は任意長の文字列にマッチする便利な表現ですが、同時に、「できるだけ長くマッチする」という性質があります。 そうすると、1番目で見つけようが2番目で見つけようが、残りのHTMLテキストすべてにマッチして、最後の</div>でようやくマッチが終了するので、特定文字列を見つけたあと、残り全部が出てきてしまうということになってしまいます。 そこで、「.*」の代わりに「[^x]*」と言うのを考えると、「xを含まない任意長の文字列」を表せます。 このパターンを使うと、「[^<>]*」ならば、「<記号および>記号を含まない任意長の文字列」を表せます。 そうすると、「<[^<>]*>」で、完全にタグ一つのみを取り出すことができます。 『「<div」で始まって3つ目のタグに{特定の文字列}を含み、2つ先のタグ(</div>)まで。』 『タグ間は任意個の空白類(タブ・スペース・改行=\s)』 を正規表現にすると、 <div[^<>]*>\s*<[^<>]*>\s*<[^<>]*特定の文字列[^<>]*>\s*<[^<>]*>\s*<[^<>]*> これでどうでしょう。

t_hirai
質問者

補足

ご回答有り難うございます。 早速PHP正規表現チェッカーで試したところ、ヒットしませんでした。 http://okumocchi.jp/php/re.php 正確なデータはこちらになります(見やすくするために改行しています)。 なんとか2つ目のDIV全体を取得する正規表現をご教授いただけませんでしょうか。 よろしく御願い致します。 <p>​ここは適当な文字列です<br></p> <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAAKKKKACiiigD/9k=" alt="" data-rotate="" data-proportion="true" data-rotatex="" data-rotatey="" data-size="414px,586px" data-align="none" data-index="0" data-file-name="フプラン.jpg" data-file-size="149201" data-origin="," style="width: 414px; height: 586px;"> </figure> </div> <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"><img src="{特定の文字列}" alt="" data-rotate="" data-proportion="true" data-rotatex="" data-rotatey="" data-size="," data-align="none" data-percentage="auto,auto" data-index="0" data-file-name="neko1.jpg" data-file-size="7136" data-origin="," style=""> </figure> </div>

その他の回答 (1)

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.2

>早速PHP正規表現チェッカーで試したところ、ヒットしませんでした。 >http://okumocchi.jp/php/re.php そちらに私のパターンを入れて[チェック]を押したところ、正規表現の部分が /<div[^<>]*>\s*<[^<>]*>\s*<[^<>]*特定の文字列[^<>]*>\s*<[^<>]*>\s*<[^<>]*>/u に変化して、マッチし、結果として (中略)~の結果は以下の通りです。 $m[0] = <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"><img src="{特定の文字列}" alt="" data-rotate="" data-proportion="true" data-rotatex="" data-rotatey="" data-size="," data-align="none" data-percentage="auto,auto" data-index="0" data-file-name="neko1.jpg" data-file-size="7136" data-origin="," style=""> </figure> </div> となったのでちゃんと取れた気がします。

t_hirai
質問者

お礼

申し訳ありません。 私のイージーミスでした。 ご回答ありがとうございました。