Я пытаюсь выяснить механики этого плагина в 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]
соответствовали бы этим ..