preg_match возвращает идентичные элементы только один раз - PullRequest
2 голосов
/ 03 августа 2011

Я просматриваю строку и обрабатываю все элементы между! - и - !.Но только уникальные элементы - это процессы.Когда у меня есть!и немного дальше в тексте тоже! - пример-- !, второй игнорируется.

Это код:

while ($do = preg_match("/!--(.*?)--!/", $formtext, $matches)){

Я знаю о preg_match_all, но нужно сделать это с помощью preg_match.

Любая помощь?Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 03 августа 2011

Вы хотите, чтобы PHP искал совпадения только после предыдущего совпадения.Для этого вам нужно захватить смещения строк, используя флаг PREG_OFFSET_CAPTURE.

Пример:

$offset = 0;
while (preg_match("/!--(.*?)--!/", $formtext, $match, PREG_OFFSET_CAPTURE, $offset))
{
    // calculate next offset
    $offset = $match[0][1] + strlen($match[0][0]);

    // the parenthesis text is accessed like this:
    $paren = $match[1][0];
}

См. Документацию preg_match для получения дополнительной информации.

3 голосов
/ 03 августа 2011

Использование preg_match_all

edit : некоторые уточнения дают:

$string = '!--example--!   asdasd !--example--!';
//either this:
$array = preg_split("/!--(.*?)--!/",$string,-1,PREG_SPLIT_DELIM_CAPTURE);
var_dump($array);
array(5) {
  [0]=>
  string(0) ""
  [1]=>
  string(7) "example"
  [2]=>
  string(10) "   asdasd "
  [3]=>
  string(7) "example"
  [4]=>
  string(0) ""
}

//or this:
$array = preg_split("/(!--(.*?)--!)/",$string,-1,PREG_SPLIT_DELIM_CAPTURE);
var_dump($array);

array(7) {
  [0]=>
  string(0) ""
  [1]=>
  string(13) "!--example--!"
  [2]=>
  string(7) "example"
  [3]=>
  string(10) "   asdasd "
  [4]=>
  string(13) "!--example--!"
  [5]=>
  string(7) "example"
  [6]=>
  string(0) ""
}
0 голосов
/ 03 августа 2011

while ($do = preg_match("/[!--(.*?)--!]*/", $formtext, $matches)){

Укажите * в конце шаблона, чтобы указать более одного.Они оба должны быть добавлены в ваш массив $ match.

...