2014-11-09 2 views
0

У меня есть m3u файл, который содержит строки, как, например:PHP Regexp для получения переменной = «значение» из строки

#EXTINF:0 $ExtFilter="Viva" group-title="Variedades" tvg-logo="logo/Viva.png" tvg-name="Viva" 

я запускаю это в PHP без успеха:

preg_match('/([a-z0-9\-_]+)=\"([a-z0-9\-_\s.]+)\"\s+/i',$str,$matches) 

Я хочу get:

$matches[0] = $ExtFilter 
$matches[1] = Viva 
$matches[2] = group-title 
$matches[3] = Variedades 
$matches[4] = tvg-logo 
$matches[5] = logo/Viva.png 
$matches[6] = tvg-name 
$matches[7] = Viva 

Я стараюсь использовать инструменты регулярного выражения (например, this).

Thank u.

+0

У вас есть только две группы захвата в вашем регулярном выражении, как вы ожидаете, что он захватит 8 значений? Взгляните на 'preg_match_all()', если вы хотите повторно сопоставлять. – Barmar

+0

Также обратите внимание, что группы захвата начинаются с 1. '$ matches [0]' является совпадением для всего regexp. – Barmar

ответ

0

Использование preg_match_all для выполнения нескольких матчей:

preg_match_all('/([\w-]+)="([\w-\s.\/]+)"/i',$str,$matches, PREG_SET_ORDER); 

Он возвращает результаты в виде 2-мерного массива - один размер является матч, другое измерение является захват группы в матчах. Для того, чтобы получить их в единый массив, как в вашем желаемом результате, используйте цикл:

$results = array(); 
foreach ($matches as $match) { 
    array_push($results, $match[1], $match[2]); 
} 
print_r($results); 

распечатки:

Array 
(
    [0] => ExtFilter 
    [1] => Viva 
    [2] => group-title 
    [3] => Variedades 
    [4] => tvg-logo 
    [5] => logo/Viva.png 
    [6] => tvg-name 
    [7] => Viva 
) 

Я упрощенный ваше регулярное выражение с помощью \w вместо a-z0-9_. Я также добавил / ко второму набору символов, чтобы соответствовать logo/Viva.png. В конце концов я избавился от \s+, потому что это предотвратило работу последней переменной.

Смежные вопросы