• ベストアンサー

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

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

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

  • ベストアンサー
回答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