プロが教えるわが家の防犯対策術!

$data1 = file_get_contents("xxxx.txt");
で、読み込んだデータの中に

aaaaaa
bbbbbb
<!--start-->
xxxxxx
yyyyyy
zzzzzz
<!--end-->
1111111
2222222

というレコードが入っていたとします。
この中で、
<!--start-->と<!--end-->の間の
xxxxxx
yyyyyy
zzzzzz
のみを抽出して
$data2 に移したい。

どなたか、教えてください。

A 回答 (2件)

正規表現を使いましょう。


$pat = "/<!--start-->(.+)<!--end-->/ms";
if(preg_match($pat, $data1, $reg)){
$data2 = $reg[1];
}

http://jp2.php.net/preg_match

この回答への補足

残り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]でも、同じ結果でした。
 もう少し、具体的に示していただけると幸いです。

補足日時:2007/10/29 16:15
    • good
    • 0
この回答へのお礼

taketan_mydns_jp さん

98%、解決しました。
助かりました。
本当にありがとうございました。

残りの2%分は上の「この回答への補足」に書きました。

お礼日時:2007/10/29 16:14

#1です


1)の解決にはなりませんが、改行については\nの他、\rが入る事もありますので、私の場合は設定しない事の方が多いです。取得後、trim()で空白も含めて前後切り取っています。改行関連はパターン修飾子によって挙動が変わるので、私も苦手です(笑。

> $data2 = $reg[0]でも、同じ結果でした。
そんなはずは無いと思います。
$reg[0] = "<!--start-->.内容.<!--end-->";
$reg[1] = ".内容.";
となっていると思いますが。
print_r($reg);
としてみて確認してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/31 11:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!