

大変お世話になっております。

以下の様な内容のテキストファイル（example.txt）があります。

[code]

    example.txt
    
    reserve_id => 23 product_id => 34383898 payment_id => 23234 
    ・・・・・・・
    
[/code]

上記のproduct_idを下記のようなphpファイルを利用して取得し、数字の箇所のみを変数に代入する必要があります。

以下の記述のsubstrは期待通り、数字のみを取得し、変数に代入できる様ですが、product_idの桁数の増減に伴い、機能しなくなることも想定されます。

それらを勘案しどのような記述で数字のみを取得できるかお教え願いませんでしょうか。

[code]

    <?php
    
    $contents = file("example.txt");
    
    $txt_product_id = $contents[2];
    $product_id = substr("$txt_product_id", -6, -3);
    
    echo $product_id;
    
    ?>
    
[/code]

現状の形態  
product_id => 34383898

以下の様な形態で取得し変数に代入したいです。  
34383898

追記：以下の二点に関してご教授いただければ幸いです。

①ご教授頂きました記述手法でいろいろと試しましたが、どこかが抜けているためか、どうしてもエラーになります。エラーを吐き出す設定にしておりませんので内容は分かりませんが、今回の目的である”数字の箇所だけを変数に代入する”ということを実現するために、”私の提示した内容及び、ご教授の内容のどの情報が実際必要になるか”、お教え願いませんでしょうか。

②phpである必要はございませんが、これ以外にこのproduct_idをDBに挿入する作業がございます。このexample.txtはリモートサーバーで随時更新され、当phpのサイトを常にクライアントで立ち上げておく必要がございます。お聞きしたいのは、どの様な開発言語、システム的な設定でも宜しいので、当phpのサイトを立ち上げることなく、example.txtの最新情報を随時抽出し、そしてDBに挿入することができる様なことは可能でしょうか？


CC BY-SA 4.0
2019-07-26T20:45:08.400
56924
2019-07-29T02:15:42.177
2019-07-29T02:15:42.177
19211
19211
question
php
phpの記述でtxtファイルの情報を加工して抽出したいです。


元のプログラムは目的通りに動いていますか？(そうは見えないのですが...)

文字数を数える方法は認識されているとおり桁数が変わると死ぬので固定桁数が保証されているのでないかぎりやってはいけません。

区切り文字を目安にして分割するのが単純な方法です。

# explode で分割

区切り文字が空白(スペース)に見えますが、それならexplodeで分割してしかるべき要素を取り出すのが簡単です。

[code]

    $product_id = explode(" ", $txt_product_id)[5]
    
[/code]

# preg_splitで分割

区切り文字が固定ではない(例えばタブとスペースが混在している)、文字数が固定されていない(2文字かもしれないし3文字かもしれない)場合、explodeでは分割できないので、preg_splitで分割します。

[code]

    $product_id = preg_split("/\s+/", $txt_product_id)[5]
    
[/code]

正規表現で取り出す方法もありますがオーバーキルだと思います。

余談ですが、このコードが大きなPHPプログラムの一部でないのであれば、PHPで作るのはあまりお勧めしません。


CC BY-SA 4.0
2019-07-27T00:19:35.760
56928
2019-07-27T00:19:35.760
5793
56924
answer


大して難しいパターンが必要になるわけではありませんので、正規表現を使われてみてはいかがでしょうか?

[code]

    $matches = [];
    if( preg_match('\b/product_id\s*=>\s*([0-9]+)/', $txt_product_id, $matches) ) {
        $product_id = $matches[1];
        echo $product_id;
    } else {
        echo 'NO product_id';
    }
    
[/code]

`$matches[1]`と言うのは、パターン`'\b/product_id\s*=>\s*([0-9]+)/'`の中の1個目のキャプチャーグループ`([0-9]+)`を表していますので、処理対象のテキスト中で、対象の`product_id
=> 34383898`が現れる位置が現在の2番目から変わるようなことがあってもインデックスを変更する必要なく使えます。

* * *

ただ、php側で読み込むことがわかっているなら、現在のような独自形式でなく、もう少し読み込みに適したような形式にした方が良いのではないでしょうか。


CC BY-SA 4.0
2019-07-27T01:17:21.653
56930
2019-07-27T01:17:21.653
13972
56924
answer