• ベストアンサー

ある文字列間のデータの抽出

$data1 = file_get_contents("xxxx.txt"); で、読み込んだデータの中に aaaaaa bbbbbb <!--start--> xxxxxx yyyyyy zzzzzz <!--end--> 1111111 2222222 というレコードが入っていたとします。 この中で、 <!--start-->と<!--end-->の間の xxxxxx yyyyyy zzzzzz のみを抽出して $data2 に移したい。 どなたか、教えてください。

  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.1

正規表現を使いましょう。 $pat = "/<!--start-->(.+)<!--end-->/ms"; if(preg_match($pat, $data1, $reg)){ $data2 = $reg[1]; } http://jp2.php.net/preg_match

miracle2006
質問者

お礼

taketan_mydns_jp さん 98%、解決しました。 助かりました。 本当にありがとうございました。 残りの2%分は上の「この回答への補足」に書きました。

miracle2006
質問者

補足

残り2%分 (1)パターンの前後の改行の残ります。(改行のみの一行)  そこで、  $pat = "/<!--start-->\n(.+)<!--end-->\n/ms"; と指定しましたが、合致しませんでした。 (2)根本的にことですが、  パターンで合致した、  $data2 = $reg[1]; 「preg_match ($pattern, $subject ,$matches)」の説明を読みました。 「matches を指定した場合、検索結果が代入されます。  $matches[0] にはパターン全体にマッチしたテキストが代入され、 $matches[1] には 1 番目ののキャプチャ用サブパターンにマッチした 文字列が代入され、 といったようになります。 」  とありますが、  $data2 = $reg[0]でも、同じ結果でした。  もう少し、具体的に示していただけると幸いです。

その他の回答 (1)

回答No.2

#1です 1)の解決にはなりませんが、改行については\nの他、\rが入る事もありますので、私の場合は設定しない事の方が多いです。取得後、trim()で空白も含めて前後切り取っています。改行関連はパターン修飾子によって挙動が変わるので、私も苦手です(笑。 > $data2 = $reg[0]でも、同じ結果でした。 そんなはずは無いと思います。 $reg[0] = "<!--start-->.内容.<!--end-->"; $reg[1] = ".内容."; となっていると思いますが。 print_r($reg); としてみて確認してみてください。

miracle2006
質問者

お礼

taketan_mydns_jp さん そうですね。 難しく考えずに、trimで、後処理すれば済みますね。 今回は、本当に助かりました。 今、作っているPHPがあるので、 また、別の質問しますが、 その時は、よろしくお願いします。

関連するQ&A

  • 改行だけの行の削除

    $data1 = file_get_contents("xxxx.txt"); で、読み込んだデータの中に 「 aaaaaa bbbbbb xxxxx yyyyyy 111111 2222222 」 というレコードが入っていたとします。 この中で、改行だけの行を削除し、$data2 に移したいのです。 先頭行と最終行は、trimで削除できましたが、 $data1 = str_replace("^\\n", "", $data2); でも除去できません。 どうすればいいのか、お教えください。

    • ベストアンサー
    • PHP
  • C#でも文字列操作について

    string sFileNM = "c:\data\2003\12\xxxxxx.csv"; 上記の「xxxxxx.csv」を「zzzzzz.txt」に置換したいのですが、VBだとright関数とか文字操作関数で可能ですが、C#の場合には、どうすれば可能でしょうか? 宜しくお願いします。

  • シェルスクリプトでテキスト操作

    1.txtに aaaaaa,13歳 bbbbbb,11歳 ccccccc,22歳 2.txtに aaaaaa,男 bbbbbb,女 ccccccc,女 とある場合に aaaaaa,13歳,男 bbbbbb,11歳,女 ccccccc,22歳,女 という内容のデータを作りたい時、どうかいたら良いですか? whil read line do ~ doneのようにぐるぐる回さない方法があれば教えてくだ愛

  • 複数テーブルからのMAX内容の取得

    OracleのSQLに関する質問です 複数のテーブルから最大値を取得したいのですが Aテーブル 商品NO 更新日  更新時間 AAAAAA 20080101 010000 BBBBBB 20080201 020000 CCCCCC 20080131 030000 Bテーブル 商品NO 更新日  更新時間 XXXXXX 20070101 040000 YYYYYY 20070201 050000 ZZZZZZ 20080201 010000 上記2テーブルから更新日、更新時間が最大のデータを取得する方法を教えてください、商品NO等の他の項目を取得する必要はありません 上記のサンプルではAテーブルの'20080201'、'020000'が取得できる方法となります 以上 初歩的な内容ですがよろしくお願いいたします

  • 特定のフィールドの文字列を取得

    初心者ですがよろしくお願い致します。 □わからない事 ・特定のフィールドの文字列を取得 ・取得した文字列を配列に格納 □条件 ・mysqlにはすでにデータが登録済み ・PHPより操作 □具体例 フィールド名(hogehoge)に文字列が入っています。 AAAAAA(10000レコード) BBBBBB(5000レコード) CCCCCC(3000レコード) DDDDDD(1000レコード) ・・・・・・(・・・・レコード) 重複が多数ありますが、重複しない文字列だけを取り出して配列に格納したいと思っていますが、うまいやり方がわかりません。 どなたか教えて頂けませんか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • KSHでの文字列操作

    はじめまして。お教授下さい。><。 下記のようなファイルがあったとしまして、 それぞれ「;」までの文字列を、ファイルの頭からLOOPで取得して表示させたいと思っています。 ↓↓(FILE_START) aaa a aaa ; bb bb bg; ccccc; ↑↑(FILE_END) 【答え】 aaaaaaa; bbbbbb; ccccc; (改行はあってもなくても、無視して頂いて問題ありません) これを、kshで書くにはどうしたらいいでしょうか。 (見やすくレスポンスがいいと、とても嬉しいです。。) 初歩的な質問で申し訳ありません。 なにとぞ宜しくお願い致します。><。。

  • テキストファイルをエクセルにコピーするマクロ

    エクセルマクロの初心者です 以下のようなテキストファイルをエクセルにコピーするマクロを作りたいです。 1、ボタンをクリックするとテキストファイルを選択する画面になる 2、テキストファイルを選択すると、その中から欲しい行のみエクセルのsheet3のA1、B1の順にコピーされる 3、テキストファイルのコピーしたい行はキーワードの間のもの 例(キーワードをAとBとする) xxx xxxx,xxxxxx xxxx,A yyyyy yyyyyyy yyyyyy,yyyy zzzzzzz zzzzzzz z zzzz,B このような形式のAとBの間にあるyyyyy yyyyyy yyyyyy,yyyyをコピーしたい xxx xxxx,xxxxxx xxxx,A yyyyy yyyyyyy yyyyyy,yyyy xxx xxxx,xxxxxx xxxx,A ttttt tttttt tttttt,tttt zzzzzzz zzzzzzz z zzzz,B このような場合も混在し、このときはtttt tttttt ttttt,ttttのみコピーする つまり xxx xxxx,xxxxxx xxxx,A yyyyy yyyyyyy yyyyyy,yyyy zzzzzzz zzzzzzz z zzzz,B xxx xxxx,xxxxxx xxxx,A yyyyy yyyyyyy yyyyyy,yyyy xxx xxxx,xxxxxx xxxx,A ttttt tttttt tttttt,tttt zzzzzzz zzzzzzz z zzzz,B このようなテキストに対して実行すると、Sheet3に yyyyy yyyyyyy yyyyyy,yyyy ttttt tttttt tttttt,tttt となるようにしたい 詳しい方、知恵を貸してください よろしくお願いします。

  • アクセスでのデータの引き抜き(抽出)方法について

    アクセスのデータ抽出についてご質問が ございます。 100件あるデータの中から 抽出条件が異なるデータを レコードごとに3件抽出したいのですが 困ってます。 例えば、100件のデータの 1フィールド目の数値が 1234567890 7891234567 5678901234 となる値を 抽出条件に割り当て 100件中3件ほど、レコードごとに 抽出出来る 方法はないでしょうか? お手数ですがアドバイスお待ちして おります。

  • Bシェルでファイルから特定の範囲を抽出するには?

    お世話になります。 ディレクトリにファイル群があるとします。 そのファイル群の中の特定のファイルの特定の個所を抽出し、別ファイルに吐くというシェルを組みたいのですが、 どのようにしたら良いでしょうか? <例> ●ファイル群は作成された日付を持ちます。 売上_200601.txt、売上_200602.txt、売上_2006003.txt、売上_200604.txt・・・・・・ ●ファイルの中身はある法則が成立しています。 (売上_20060101.txtの中身) 東京都 start AAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDD 1000円 東京都 end 大阪府 start AAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDD 10000円 大阪府 end 神奈川県 start AAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDD 20000円 神奈川県 end 北海道 start AAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDD 3000円 北海道 end ・ ・ ・ ※都道府県の重複はありません 月毎の売上が纏められているファイルの中から特定の年月の都道府県売上分を抽出したいです。 抽出条件としましては「年月」「都道府県」が与えられます。 上記の例でいくと、「売上_200601.txt」の「東京都 start~東京都 end」までを抽出したいのです。 ファイルの特定は抽出条件の「年月」を元にfindコマンドにて導き出すことは可能なのですが、 中身の「東京都 start~東京都 end」をどのように抽出するのかが分かりません。 分かり難い内容に恐縮ですが、ご教授の程よろしくお願いします。

  • SQL 重複データの抽出

    こんにちは SQLで教えてください 今 会員番号ごとの重複データがあります 例  会員番号 日付    金額 住所 その他1 その他2     1 2001/01/01  120 XXXX YYYYY  UUUUUU     1 2001/12/01  130 XXX YYYYY IIIII ⇒ 2 2001/08/12 50 pppp iiiii ooooo 3 2003/01/06 60 iiiii iiii uuuuu ⇒ 3 2002/03/18 10 22222 eeeee nnnnn 3 2001/08/19 500 ddddd rrrrr rrrrr 上記の様なデータで会員番号ごとで日付の最大のレコード(同一日なら入力順に最初)のレコードを抽出したいのですが distinctを使うと会員番号と日付のデータしか抽出されませんので その他の項目も抽出したいのですが... SQLでできなければ VB2005でもいいのですが?....   どうかよろしくお願いします。

専門家に質問してみよう