2015-02-26 4 views
0

Я использую preg_match для поиска элементов img в xml с определенным шаблоном src или href. Примеры: < img src= "level1/level2/2837", < img href ='level1/level2/54322'.Получить все совпадения с помощью функции regexp preg_match() в PHP

preg_match('/< *\/? *' // Begining of xml element 
    . 'img' // "img" atribute 
    . '[^>]*' // Any character except > 
    . '(?:src|href) *= *' // src or href attribute with possible spaces between = 
    . '(?:"|\')level1\/level2\/(\d+)(?:"|\')/', // "level1/level2/2837" 
    $subject, $matches); 

Он работает, но возвращает только первый матч.

Например, если объект имеет это содержание:

$subject = "< img src= 'level1/level2/2837'/> <p>something</p> < img href ='level1/level2/54322'"; 

В результате я получаю это:

$matches => Array 
    ( 
     [0] => '< img src= "level1/level2/2837"' 
     [1] => '2837' 
    ) 

Как я могу получить все матчи в $matches массиве?

Я уже использовал simplexml_load_string для достижения этого, но хотел бы понять, как работают регулярные выражения с preg_match.

ответ

2

Использовать preg_match_all вместо preg_match.

+0

'[SRC | HREF]' в своем регулярном выражении это совершенно неправильно .. –

+0

@AvinashRaj хорошо .. Вы правы, что будет соответствовать один символ благодарности. Я обновляю его – Miguelos

2

Вам необходимо повернуть ["|'] в (?:"|'). Это ['|"] будет соответствовать ' или | или ". А также вам нужно использовать preg_match_all для выполнения глобального соответствия.

preg_match_all('/< *\/? *' 
    . 'img' 
    . '[^>]*' 
    . '(?:src|href) *= *' 
    . '(?:"|\')level1\/level2\/(\d+)(?:"|\')/', 
    $subject, $matches); 
Смежные вопросы