Прямо сейчас я работаю над скриптом 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».