PHPでの正規表現の使い方と備考情報の抽出方法

このQ&Aのポイント
  • PHPで正規表現を使用して備考情報を抽出する方法がわかりません。
  • サンプルコードには「<strong>備考:</strong>&nbsp;」の次の行の情報を取得するための正規表現が記述されていますが、うまく動作しません。
  • 改行コードや特殊文字の取得や判定がうまくできず、問題に困っています。どなたか教えていただけないでしょうか。
回答を見る
  • ベストアンサー

PHPでの正規表現

PHPでの正規表現 下記のようなソースがあり、「備考情報・・・」の部分だけを抽出する正規表現がわからず困っております。 -------sample code------- <div class="product"> <strong>商品情報:</strong> </div> <div class="comment"> <strong>備考:</strong>&nbsp; 備考情報・・・・・ </div>   :   : -------sample code------- 以下のような正規表現を書いてみましたが、上手くいきませんでした。 「<strong>備考.* ([^\n]+)」 「<strong>備考:</strong>&nbsp;」の次の行の情報で、改行されるまでの情報を取得したいと考えております。 何度か試みても&nbsp;のコードや改行コードの取得、判定がうまくいかず、頭を抱えている次第でございます。 どなたかご教授いただけますと幸いです。 よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • 0x131cc6e
  • ベストアンサー率36% (42/115)
回答No.1

<?php $txt =<<<EOT <div class="product"> <strong>商品情報:</strong> </div> <div class="comment"> <strong>備考:</strong>&nbsp; 備考情報・・・・・ </div> EOT; $nCount = preg_match( '/(<strong>備考:<\/strong>&nbsp;\n)(.*[^\n])(\n<\/div>)/', $txt, $maches ) ; var_dump( $nCount ) ; var_dump( $maches ) ; ?> で良いのでは?

janne-like
質問者

お礼

ありがとうございました。 当方の記入漏れで、 <div class="comment"> <strong>備考:</strong>&nbsp; 備考情報・・・・・ </div> の部分の末尾、</div>の出現はイレギュラー。 商品情報は複数回出現し、その備考を全て得たい。 ということを説明するのを怠っていました。 しかし、0x131cc6eさまのご回答のおかげで preg_match_all( '/(<strong>備考:<\/strong>&nbsp;\n)(.*[^\n])(\n)/', $txt, $maches ) ; とすることにより、無事、得たい情報を得ることができました。 この度は誠にありがとうございました。

関連するQ&A

  • 正規表現

    分かりづらい質問で申し訳ありませんが、PHPの正規表現で教えて下さい。 現在下記のような文字列があります。 見やすく改行しましたが、本来は改行はなく、1行です。 最初にPタグがあり、次に複数のクラスが付いたdiv(これを①とします)、同じく複数のクラスが付いたdivタグ(これを②とします)があるような構造です。 このdivタグの中にはfigureタグ、その中にimg タグがあります。 ②番目のdivの中のimgのsrcには特定の文字列があります。 この特定の文字列を含む親のdivタグ全体を抜き出す正規表現を書きたいと思っています。 つまり、正規表現の結果下記部分が抽出できればと思います(これを「正解」とします)。 <div class="(省略)"> <figure> <img src="{特定の文字列}"> </figure> </div> 現在このように記述しましたが、①、②全てのdivが取得されてしまっている状態です。 「/<div class="se-component se-image-container __se__float-none" contenteditable="false">(?>).*<\/div>/i」 これを「正解」のように抽出するにはどのような正規表現になるのでししょうか? よろしく御願い致します。 <p>ghoge</p> <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"><img src="data:image/jpeg;base64,/9j/4AA" alt="" data-rotate=""> </figure> </div> <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"><img src="{特定の文字列}" alt="" data-rotate=""> </figure> </div>

    • ベストアンサー
    • PHP
  • 正規表現で複数行に渡る範囲を取り出す

    <html> <div></div> <div class="content"> <b>内容<b/><br /> <img src="#" /> <p>ほげほげほげほげ</p> </div> <div></div> </html> 上のようなHTMLがあるとします。<div>の前後にもhtmlは書かれています。 そこから正規表現で<div class="content">~~~</div>の中身を取り出したいのですが、できません。 言語はPHPで、 /<div class=\"content\">.*<\/div>/ と書いてみたんですが、改行などがありうまくいきませんでした。 どのようにに記述すればうまくいくんでしょうか。

    • ベストアンサー
    • PHP
  • 正規表現について教えてください

    こんにちは。 PHPの正規表現を使用して、あるサイトのhtmlソースから特定のタグ間にある文字を抜き取りたいです。 例えば、下記の場合9を抜き取りたいです。 <div class="a">9</div> この場合の処理方法を教えてください。

    • 締切済み
    • PHP
  • 正規表現で取得できそう?

    $moji = "りんご{code:A0001}酸素"; 上記の文字列より 変数Aに "{code:A0001}" を取得したいのですが、 正規表現で取得することは可能でしょうか? 初心者にお勧めな正規表現の解説サイトありましたら教えて下さい。 よろしうおねがいします。

    • ベストアンサー
    • PHP
  • PHPにおける正規表現について

    PHPにおける正規表現について ご教授ください。 いわゆる、対象の文字列が複数行にわたっていた場合のことです。 $data = <<< EOF ABCDE FGH EOF; $hoge = preg_match("/EF/" ,$data,$match); と上記のようなコードがあった場合 対象の文字列群から【EF】という文字列を検索したい場合、どのように記述したら 【E(間に改行)F】の文字列と一致させる事ができるでしょうか? 仮に正規表現の修飾子の【s】や【m】を用いても上記の例の場合 一致させることができないと思います。 やはり、対象の文字列群 $data の改行文字をいったん削除したものから検索 するのがベターでしょうか? 正規表現に造詣の深い方よろしくご教授ください。

    • ベストアンサー
    • PHP
  • PHP 正規表現の書き方おしえてください!

    PHP&正規表現初心者です。 ヤフーファイナンスランキングから順位ごとに株価データを取得したいの ですが、正規表現の書き方がわからず意図したデータが取得できません。 ご教授ください。 ソース ************************************************ ~ <tbody> <tr class="rankingTabledata yjM"> <td class="txtcenter">1</td><td class="txtcenter"> <a href="http://stocks.finance.yahoo.co.jp/stocks/detail/?code=0002.t">0002</a></td> <td class="txtcenter yjSt">東証JQS</td> <td class="normal yjSt">(株)シxダー</td> <td class="txtcenter grey yjSt">12/18</td> <td class="txtright bold">313</td> <td class="txtright bgyellow02"><span class="greenFin">+23.72</span>%</td> <td class="txtright bgyellow03"><span class="greenFin">+60</span></td> <td class="txtright">5,917,300</td> <td class="txtcenter yjSt"> <a href="http://textream.yahoo.co.jp/rd/finance/0002">掲示板</a></td></tr> <tr class="rankingTabledata yjM"> <td class="txtcenter">2</td><td class="txtcenter"> <a href="http://stocks.finance.yahoo.co.jp/stocks/detail/?code=0003.t">0003</a></td> <td class="txtcenter yjSt">マザーズ</td> <td class="normal yjSt">(株)リxアワールド</td> <td class="txtcenter grey yjSt">12/18</td> <td class="txtright bold">2,125</td> <td class="txtright bgyellow02"><span class="greenFin">+23.19</span>%</td> <td class="txtright bgyellow03"><span class="greenFin">+400</span></td> <td class="txtright">6,800</td> <td class="txtcenter yjSt"> <a href="http://textream.yahoo.co.jp/rd/finance/0003">掲示板</a></td></tr> <tr class="rankingTabledata yjM"> <td class="txtcenter">3</td> ~ *********************************************** ソースはこんな感です。 ↓私のクソ文章 $n = preg_match_all("{<tr class=\"rankingTabledata yjM\"><td class=\"txtcenter\">(.*)</td><td class=\"txtcenter\"><a href=.*>(.*)</a>}", $feed, $cell, PREG_PATTERN_ORDER); preg_match_allで配列に格納して表示させたいのですが、 うまくいきません。 echo "1位  " . $cell[1][0] . " " . $cell[1][1] . " " . $cell[1][2] .....??"\n"; echo "2位  " . $cell[1][1] . "\n" ?????; ~ ???3次配列ですか?? 混乱します。 ☆☆☆理想☆☆☆☆ 1位 2435 東証JQS (株)シダー 12/18 313 +23.72 % +60 5,917,300 2 位 3691 マザーズ (株)リアルワールド 12/18 2,125 +23.19% +400 6,800 ~ ☆☆☆☆☆☆☆☆☆ 取得した株価コードから別サイトを検索したいので 各項目ごとに別要素で表示させたいです。 ダメダメなので よろしくおねがいします。

    • ベストアンサー
    • PHP
  • 正規表現に困っています!!

    以下のような文字列にある「@1」・「@2」・「@3」・「@4」を抜き出したいのですが、 どんな正規表現を使用すれば良いか教えて頂けると非常に助かります。 <!-- #BeginLibraryItem "/Library/image01.lbi" -->\r\n <div class="@1"><img src="@2" alt="@3"></div>\r\n <p class="captionBlockA01 center">@4</p>\r\n <!-- #EndLibraryItem -->

  • 正しい正規表現を教えてください

    お世話になります。 正規表現で次のように指定しているのですが、正確か自信がありませんので 正しい表記を教えてください。 1.全てのHTMLタグ <.*?> 2.「2012.1.1」または「2012.01.01」のような数字の羅列 (\d{4}).(\d{1,2}).(\d{1,2}) 3.「<img src="~」から始まる部分 <img src=" 4.「<div class="release">」を含む部分 <div class="release"> 5.HTMLタグと文字全て ^.*$ 全て色々なサイトで調べて表記したのですが、処理に時間がかかってて間違っている気がします。 yahoo!pipesのregexモジュールの部分で使用していて、デバッガーのTime takenに時間がかかっている場合、正しくない正規表現が原因らしいのです。 どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現で分かりません

    例えば以下のようなパターンの正規表現チェックがあるのですが、 どのようなものを意味しているか分かりません。 教えていただけますでしょうか。 よろしくお願いします。 以下の情報は調べたのですが。 +(プラス)・・・直前の1文字の1回以上の繰り返しを表現 . (ピリオド)・・・改行コード以外の1文字にマッチするか否か [ ](大括弧)・・・囲みの中に書かれた任意の1文字にマッチするか否か ^([^ ]+) +[^ ]+.+S3.lzh

  • 正規表現 ""で囲まれた内部は処理しない方法

    正規表現でタグ内の項目内容に""をつける処理を考えています。 現在は、= の右側にある内容を""で囲む処理をしています。 C#で書いたコードは次ような感じです。 text = Regex.Replace(text, "(\\S)=([^\"' >]+)","$1=\"$2\"" ,RegexOptions.Singleline); このときに次のようなHTMLコードがあった場合、  <div id=000 class="tayp1,type2">  <div id="111" class=type1>  <img src="200.gif" alt="100+100=200"> すると次のような結果になります。  <div id="000" class="tayp1,type2">  <div id="111" class="type1">  <img src="200.gif" alt="100+100="200""> 3行目はalt内にも=があるため間違った処理をしてしまいます。 誤:alt="100+100="200"" このような""内部は処理しないようにするにはどうすればよろしいでしょうか? ""内部の=にはヒットしななれば…と思っているのですが。 よろしくお願いします。

専門家に質問してみよう