Необходимо найти не первое вхождение слова, а n-ое.
Вызовите функцию preg_match_all(), чтобы занести все совпадения в массив; затем извлеките то совпадение, которое вас интересует:
preg_match_all ("/$pattern/$modifiers", $string, $matches)
foreach($matches[1] as $match) {
print "$match\n";
}
В отличие от Perl, Perl-совместимые регулярные выражения в PHP не
поддерживают модификатор /g, позволяющий выполнить цикл поиска всех совпадений в строке за один раз. Вместо функции preg_match() здесь необходимо использовать функцию preg_match_all().
Функция preg_match_all() возвращает двумерный массив. Первый элемент содержит массив совпадений с полным шаблоном. Второй элемент также содержит массив совпадений, но на более мелком уровне
подсовпадений, заключенных в круглые скобки внутри каждого полного совпадения. Так, чтобы получить третью пару к слову potato, надо извлечь третий элемент из второго элемента массива $matches:
$potatoes = 'one potato two potato three potato four';
preg_match_all("/(\w+)\s+potato\b/", $potatoes, $matches);
print $matches[1][2];
three
Вместо того чтобы возвращать массив, содержащий отдельно полные
совпадения и подсовпадения, функция preg_match_all() может возвратить массив, состоящий из отдельных массивов для каждого совпадения, включающих все его внутренние подсовпадения. Чтобы указать
такой способ поведения функции, передайте в качестве четвертого аргумента параметр PREG_SET_ORDER. Теперь three содержится не в элементе $matches[1][2], как раньше, а в элементе $matches[2][1].
Чтобы определить общее количество совпадений, проверьте значение,
возвращенное функцией preg_match_all():
print preg_match_all("/(\w+)\s+potato\b/", $potatoes, $matches);
3
Обратите внимание, что совпадений только три, а не четыре, поскольку после слова four в строке нет завершающего слова potato.