見よ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]
になるので、これが実際にネストされて考慮すれば1
2
3
を持つことが乱雑に得ることができます文字通り
(?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")
これはもっと複雑です(?: ..)
はキャプチャしていないグループです。これはキー/値がマッチ配列で同じインデックスで巻かれますが、togatherでキャプチャされないようになっています。 =
の場合、以外のものよりは"
で終わります。基本的には1辺がキーをキャプチャし、コンマ改行が、その後何も
- と最後
http[^\s]
URL今
との二重引用符を除く他の値が
,[^\r\n]+
開始は私がオーダーについて言ったことを覚えていますそれは4 希望に番号を取得することはありませんので、それはあなたが基本的な理解を持っている必要があります許可され、助けその第三いずれかに一致する,A&E
http://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-重複した数値インデックスを削除する方法が見つかった場合は、私と共有してください...笑...名前付きのキャプチャグループを使用しなかった場合、これは正常な一致です。それが乱雑になると言いました。
これらのスペースとは何ですか、タブ、またはスペースですか?もしそれらがタブであれば、 'fgetcsv($ handle、0、" \ t ")'のように 'fopen( 'php:// temp')'をcsvで解析することができます。 – ArtisticPhoenix
スペースはタブではありません。 –