Перебор совпадений из preg_match_all - PullRequest
2 голосов
/ 14 ноября 2011

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

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

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011

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

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

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

2 голосов
/ 15 ноября 2011

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

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

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

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

...