PHP preg_match_all, как начать новые результаты после нескольких первых случаев?

Прямо сейчас я работаю над скриптом PHP, который извлекает все события из текста, который имеет "SizeName": и вот код для этого:

 preg_match_all('/\"SizeName\":\"([0-9.]+)\"/',$str,$matches); 

Эта строка кода возникает с первого раза, когда она находит "SizeName": но как я могу заставить ее начать печатать данные, например, в третий раз, когда находит "SizeName":

Возможно ли и как я могу это достичь?

Попробуй это:

 preg_match_all('/(?:(?:.*?"SizeName":){2}|\G).*?\K"SizeName":"([0-9.]+)"/s', $str, $matches); 

демонстрация


 (?: (?# start non-capturing group for alternation) (?: (?# start non-capturing group for repetition) .*? (?# lazily match 0+ characters) "SizeName": (?# literally match "SizeName":) ){2} (?# repeat twice) | (?# OR) \G (?# start from last match) ) (?# end alternation) .*? (?# lazily match 0+ characters) \K (?# throw away everything to the left) "SizeName": (?# literally match "SizeName":) "([0-9.]+)" (?# match the number into capture group 1) 

Заметки:

  • Вам не нужно бежать " , так как это не специальный символ регулярного выражения, и вы создаете свою строку PHP с помощью.
  • Измените {2} чтобы изменить количество экземпляров SizeName чтобы пропустить (я не был уверен, что вы хотите пропустить 3 или начать с 3-го).
  • Модификатор s необходим, если между экземплярами SizeName есть символы новой строки, так как .*? не будет соответствовать символам новой строки без него.

Используйте комбинацию strpos и смещение preg_match_all. В принципе, начните поиск после второго вхождения строки.

 $offset = strpos($str, 'SizeName', strpos($str, 'SizeName', 8) ) + 8; preg_match_all( '/(?:(?:.*?"SizeName":){2}|\G).*?\K"SizeName":"([0-9.]+)"/s', $str, $matches, PREG_PATTERN_ORDER, $offset ); 

Я сильно кодирую число 8, потому что это длина строки «SizeName».