Итерация по совпадениям из preg_match_all

Я пытаюсь выяснить механики этого плагина в WordPress. У меня есть функция preg_match_all, которая выглядит так:

preg_match_all('/(?<=\\[\\[).+?(?=\\]\\])/', $content, $matches, PREG_PATTERN_ORDER); $numMatches = count($matches[0]); for ($i = 0; $i < $numMatches; $i++) { $postSlug = $matches[0][$i]; } 

Если я правильно это понимаю, count($matches[0]) предполагает, что в $content есть только одно совпадение.

Моя цель здесь – перезаписать оператор for, чтобы разрешить полный массив совпадений в скрипте preg_match_all .

Я предполагаю, что я должен заменить оператор for foreach ($matches as $postSlug) и даже не беспокоить запутанные $matches[0][$i] foreach ($matches as $postSlug) $matches[0][$i] в конце.

К сожалению, конечный вывод, по-видимому, не проходит через каждый элемент массива. Есть идеи? Благодаря!

Если я правильно понимаю, count ($ matches [0] предполагает, что в $ content есть только одно совпадение.

Не совсем; $matches[0] представляет массив совпадений всего регулярного выражения (в отличие от, например, $matches[1] , который будет массивом совпадений в первой группе совпадений регулярного выражения). Таким образом, count($matches[0]) – количество совпадений в первой группе совпадений.

Вы могли бы сделать то, что вы сказали, и переписать цикл for как цикл foreach , но это ничего не изменит, поскольку оба метода должны пересекать все элементы в $matches[0] . Вы уверены, что результаты, которые вы ищете, соответствуют вашему регулярному выражению?

Если вы хотите переписать этот код, то я предлагаю вам заглянуть в PREG_SET_ORDER как последний аргумент, а не PREG_PATTERN_ORDER . Сначала группирует массив результатов по результатам и с группами соответствия на втором уровне.

Затем вы можете просто перевернуть его следующим образом:

 foreach ($matches as $matchgroup) { $postslug = $matchgroup[0]; } 

Вам все еще нужно [0] чтобы получить «полное совпадение». Если у вашего шаблона были какие-то (..) группы, тогда [1] и [2] соответствовали бы этим ..