Получить весь текст между тегами с помощью preg_match_all () или лучшей функции? - PullRequest
2 голосов
/ 17 июня 2010
2010-June-11
<remove>2010-June-2</remove>
<remove>2010-June-3</remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-3
2010-June-2
2010-June-1

Я пытаюсь найти все экземпляры, которые находятся между <remove> тегами

Вот что у меня есть:

$pattern = "/<remove>(.*?)<\/remove>/";
preg_match_all($pattern, $_POST['exclude'], $matches);

foreach($matches as $deselect){
    foreach ($deselect as $display){
        echo $display."<br />";
    }
}

Вот что он возвращает:

2010-June-2
2010-June-3
2010-June-2
2010-June-3

Почему это удваивается, и как мне это предотвратить?

Ответы [ 3 ]

2 голосов
/ 17 июня 2010

Не используйте регулярные выражения для анализа xml / html ...

С учетом вышесказанного проблема заключается в том, что структура соответствия выглядит следующим образом:

array(
    0 => array('whole match1', 'whole match 2', 'whole match 3'),
    1 => array('subpattern match 1', 'subpattern match 2', 'subpattern match 3'),
);

Итак, вместо того, чтобы выполнять свой foreach, выполните:

if (!empty($matches)) { 
    foreach ($matches[1] as $value) {
        echo $value;
    }
}

или используйте флаг PREG_SET_ORDER для preg_match_all, что приведет к такой структуре массива, как:

array( 
    0 => array('whole match1', 'subpattern match 1'),
    0 => array('whole match2', 'subpattern match 2'),
    0 => array('whole match3', 'subpattern match 3'),
);

Итак, тогда ваш foreach станет:

if (!empty($matches)) { 
    foreach ($matches as $match) {
        echo $match[1];
    }
}
1 голос
/ 30 декабря 2011

попробуйте использовать $matches[0] вместо $matches.

У меня была такая же проблема

0 голосов
/ 17 июня 2010

Не является решением регулярных выражений, но вы можете удалить дубликаты следующим образом:

array_unique($matches);
...