Search code examples
phppreg-matchpreg-match-all

php preg_match find all lines which have match


The string is:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=350000
128/prog_index.m3u8?key=2dd12d6d79fa163d539952ec25c6c969&app=com.dcom&part=1-1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=500000
256/prog_index.m3u8?key=2dd12d6d79fa163d539952ec25c6c969&app=com.dcom&part=1-1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=750000
500/prog_index.m3u8?key=2dd12d6d79fa163d539952ec25c6c969&app=com.dcom&part=1-1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000
750/prog_index.m3u8?key=2dd12d6d79fa163d539952ec25c6c969&app=com.dcom&part=1-1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1250000
1000/prog_index.m3u8?key=2dd12d6d79fa163d539952ec25c6c969&app=com.dcom&part=1-1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1750000
1500/prog_index.m3u8?key=2dd12d6d79fa163d539952ec25c6c969&app=com.dcom&part=1-1

And I want to find all prog_index.m3u8 urls. My code is:

preg_match_all('/(.*?)prog_index.m3u8(.*?)/mis', $get, $found);

Solution

  • You can do it without regex:

    $result = array_filter(explode("\n", $get), function ($i) {
        return $i[0] != '#' &&
          array_pop(explode('/', parse_url($i, PHP_URL_PATH))) == 'prog_index.m3u8'; 
    });
    

    In this way you can be sure that the line is a URL with prog_index.m3u8 as filename.