2017-01-24 8 views
0

あなたが私を助けてくれることを願っています。私は、あなたが見ることができるように、そこにファイル #1 EXTM3Uのための主要なタグであり、その下のビデオ情報タグを起動し、次は.m3uファイルphp Curlでm3uファイルを解析する

#EXTM3U 
#EXTINF:-1 tvg-id="" tvg-name="A&E" tvg-logo="" group-title="ENTRETENIMIENTO",A&E 
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts 
#EXTINF:-1 tvg-id="" tvg-name="ABC Puerto Rico" tvg-logo="" group-title="NACIONALES",ABC Puerto Rico 
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts 
#EXTINF:-1 tvg-id="" tvg-name="Animal Planet" tvg-logo="" group-title="ENTRETENIMIENTO",Animal Planet 
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/185.ts 

に持っている(#EXTINF:-1 ... )とそのビデオリンクエントリ(のhttpダウン:// .....)

は、明示的に私はそれはかなり大きなものです(このファイル全体を解析する方法を教えて)とのフィールドを保存することができます例えばこのような配列? videos [] 以降すべてのビデオの属性にアクセスできますvideos [0] ['title']最初のビデオのタイトルを取得するには?他の属性、例えばvideos [42] ['link']と続き、ビデオ#42へのリンクを取得します。私はすでにこの

<?php 
    $handler = curl_init("link to m3u file"); 
    $response = curl_exec ($handler); 
    curl_close($handler); 
    echo $response; 
?> 

何私が今必要なのカール応答を解析し、私がアクセスも可能配列、にすべての動画情報を保存することであるような変数にファイルの内容を取得するには、カール使用しています

すべての動画のすべての属性に適用されます。

私はいくつかのregexpなどを使用する必要があることを知っています。私はちょうど方法を理解していない。いくつかのコードで私を助けてくれますか?どうもありがとうございます。

+0

これらのスペースとは何ですか、タブ、またはスペースですか?もしそれらがタブであれば、 'fgetcsv($ handle、0、" \ t ")'のように 'fopen( 'php:// temp')'をcsvで解析することができます。 – ArtisticPhoenix

+0

スペースはタブではありません。 –

答えて

1

見よREGX

のマジック
$string = <<<CUT 
#EXTM3U 
#EXTINF:-1 tvg-id="" tvg-name="A&E" tvg-logo="" group-title="ENTRETENIMIENTO",A&E`http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts 
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts 
#EXTINF:-1 tvg-id="" tvg-name="ABC Puerto Rico" tvg-logo="" group-title="NACIONALES",ABC Puerto Rico 
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts 
CUT; 

preg_match_all('/(?P<tag>#EXTINF:-1)|(?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")|(?<something>,[^\r\n]+)|(?<url>http[^\s]+)/', $string, $match); 

$count = count($match[0]); 

$result = []; 
$index = -1; 

for($i =0; $i < $count; $i++){ 
    $item = $match[0][$i]; 

    if(!empty($match['tag'][$i])){ 
     //is a tag increment the result index 
     ++$index; 
    }elseif(!empty($match['prop_key'][$i])){ 
     //is a prop - split item 
     $result[$index][$match['prop_key'][$i]] = $match['prop_val'][$i]; 
    }elseif(!empty($match['something'][$i])){ 
     //is a prop - split item 
     $result[$index]['something'] = $item; 
    }elseif(!empty($match['url'][$i])){ 
     $result[$index]['url'] = $item ; 
    } 
} 

print_r($result); 

戻り

array (
    0 => 
    array (
    'tvg-name' => 'A&E', 
    'group-title' => 'ENTRETENIMIENTO', 
    'something' => ',A&E`http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts', 
    'url' => 'http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts', 
), 
    1 => 
    array (
    'tvg-name' => 'ABC Puerto Rico', 
    'group-title' => 'NACIONALES', 
    'something' => ',ABC Puerto Rico', 
    'url' => 'http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts', 
), 
) 

私はこれのいくつかは、例えばsomething何であるか見当もつかない冗談はさておき。とにかくあなたは始めるべきです。

regxの場合、実際には簡単に分解できます。実際のトリックはpreg_matchの代わりにpreg_match_allを使用しています。

は、ここに私たちのREGX

/(?P<tag>#EXTINF:-1)|(?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")|(?<something>,[^\r\n]+)|(?<url>http[^\s]+)/ 

まず、我々はより管理ビットにそれを打破しますです。これらは、またはのためにパイプ|で区切られています。それぞれが別個のパターンとして考えられ、この1つまたは次のパターンと一致する。今度は、左から右に一致するので、順序が重要になる可能性があります。左に一致する場合は停止します。だからあなたは2つの場所で一致することができるregxを持っていないことに注意する必要があります(あなたがそれを望んでいない場合)。しかし、以下に示すように、それはあなたの利点にも使えます。これは実際に我々が扱っているものです

(?P<tag>#EXTINF:-1) 

(?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)") 

(?<something>,[^\r\n]+) 

(?<url>http[^\s]+) 

4つの正規表現。これらすべての場合、名前付きのキャプチャグループである(?P<name>...)は、読みやすく、簡単に見つけやすくなります。たとえば!empty($match['tag'][$i])のような一致を見つけるために使用する条件を見ると、指定されたキャプチャグループのためにtagインデックス/キーを使用できます。そうでない場合は1となります。 REGXの数とすべて一緒に、あなたはそれが我々が

  • #EXTINF:-1試合にこの文字列を持って取り出されたら、それは、とにかくなどのタグの$match[1][$i]になるので、これが実際にネストされて考慮すれば123を持つことが乱雑に得ることができます文字通り
  • (?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")これはもっと複雑です(?: ..)はキャプチャしていないグループです。これはキー/値がマッチ配列で同じインデックスで巻かれますが、togatherでキャプチャされないようになっています。 =の場合、以外のものよりは"で終わります。基本的には1辺がキーをキャプチャし、コンマ改行が、その後何も
  • と最後http[^\s] URL今

との二重引用符を除く他の値が

  • ,[^\r\n]+開始は私がオーダーについて言ったことを覚えていますそれは4

    希望に番号を取得することはありませんので、それはあなたが基本的な理解を持っている必要があります許可され、助けその第三いずれかに一致する,A&Ehttp://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts `で始まることを除いて重要で、このURL http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.tsは、最後の式と一致しますのRegx、これは実際にそれに関する完全なチュートリアルの場所ではなく、私は数分で提供できるより良い例を見つけることができます。

    ただ、完全を期すために、ここではそれが初めてインデックスを実行するときに、forループを見れば上記の配列にitemを見つけるためpreg_match_all戻り

    (
        [0] => Array(
          [0] => #EXTINF:-1 
          [1] => tvg-name="A&E" 
          [2] => group-title="ENTRETENIMIENTO" 
          [3] => ,A&E`http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts 
          [4] => http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts 
          [5] => #EXTINF:-1 
          [6] => tvg-name="ABC Puerto Rico" 
          [7] => group-title="NACIONALES" 
          [8] => ,ABC Puerto Rico 
          [9] => http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts 
         ) 
        [tag] => Array(
          [0] => #EXTINF:-1 
          [1] => 
          [2] => 
          [3] => 
          [4] => 
          [5] => #EXTINF:-1 
          [6] => 
          [7] => 
          [8] => 
          [9] => 
         ) 
        [1] => Array(
          [0] => #EXTINF:-1 
          [1] => 
          [2] => 
          [3] => 
          [4] => 
          [5] => #EXTINF:-1 
          [6] => 
          [7] => 
          [8] => 
          [9] => 
         ) 
        [prop_key] => Array(
          [0] => 
          [1] => tvg-name 
          [2] => group-title 
          [3] => 
          [4] => 
          [5] => 
          [6] => tvg-name 
          [7] => group-title 
          [8] => 
          [9] => 
         ) 
        [2] => Array(... duplicate of prop_key ..) 
        etc. 
    ) 
    

    方法はあるものの一部であります0の場合、$match[0][$i]の一致部分にはすべての一致が含まれていますが、tag配列にはそのregxと一致する項目のみが含まれていますので、$iインデックスを使用して関連付けることができます。

    if(!empty($match['tag'][$i])){ 
         //is a tag increment the result index 
         ++$index; 
        } 
    

    $match[tag][$i]が空でない場合。あなたは$match[tag][0]を見ると$i = 0と表示されますが、それは確かに空ではありません。 2番目のループで$match[tag][1]は空ですが、$match[prop_key][1]はそうではありませんので、$i = 1の項目がprop_keyの場合はわかります。それがその仕組みです。

    -ps-重複した数値インデックスを削除する方法が見つかった場合は、私と共有してください...笑...名前付きのキャプチャグループを使用しなかった場合、これは正常な一致です。それが乱雑になると言いました。

  • +0

    申し訳ありませんが、私はあなたのコードを使用し、空の配列Array()を返しました。私はちょうど質問を編集し、m3uファイルの内容のコード部分を修正しました。もう一度私に手を差し伸べることができますか?私はタグtvg-name group-titleとurlが必要です。 "何か"タグをつけてください。あなたが私に正規表現について少し説明できたら、私はそれを感謝します。もう一度ありがとう –

    +0

    それを無視するだけで何が省略されたのか。そのデータはどこに行きますか? – ArtisticPhoenix

    +0

    私はそれを無視してみましょう。しかし、コードはまだ私に空の配列を返します。私は質問のコードを修正しました、あなたは今すぐ値を取得するのを助けてくれますか? –

    0

    CURL応答を取得したら、CURLまたはfopen機能を使用してリモートロケーションからファイルを読み取ります。

    これは、リモートの場所からディレクトリにあるファイルを読み込み、すべてのファイルをローカルサーバーに保存しているためです。

    あなたはすべての情報取得のために、「スタットを」ファイル機能を使用して、私はすべての情報を収集し、その後、あなたは、配列を作成する方法についてのアイデアを与えている$ファイルに

    を維持することができます。

    アレイが作成されると、印刷用の応答をシリアル化できます。

    関連する問題