Подтвердить что ты не робот

Как я могу захватить несколько совпадений из одного и того же регулярного выражения Perl?

Я пытаюсь разобрать одну строку и получить несколько кусков данных из одной строки с теми же условиями регулярного выражения. Я разбираю один HTML-документ, который является статичным (по нераскрытой причине я не могу использовать парсер HTML для выполнения задания.) У меня есть выражение, которое выглядит так:

$string =~ /\<img\ssrc\="(.*)"/;

и я хочу получить значение $1. Однако в одной строке есть много таких тегов img, поэтому мне нужно что-то вроде возвращаемого массива (@1?), Это возможно?

4b9b3361

Ответ 1

Как говорит Джим, используйте модификатор /g (в контексте списка или в цикле).

Но будьте осторожны с жадностью, вы не хотите, чтобы .* соответствовал более чем необходимо (и не избегать < =, они не являются особыми).

while($string =~ /<img\s+src="(.*?)"/g ) {
  ...
} 

Ответ 2

@list = ($string =~ m/\<img\ssrc\="(.*)"/g);

Модификатор g соответствует всем вхождениям в строке. Контекст List возвращает все совпадения. См. Оператор m// в perlop.

Ответ 3

Вам просто нужен глобальный модификатор /g в конце матча. Затем прокрутите пока не осталось совпадений

my @matches;
while ($string =~ /\<img\ssrc\="(.*)"/g) {
        push(@matches, $1);
}

Ответ 4

Используйте модификатор /g и контекст списка слева, как в

@result = $string =~ /\<img\ssrc\="(.*)"/g;