Obter todo o texto entre as tags com preg_match_all () ou melhor function?

2010-June-11 2010-June-2 2010-June-3 2010-June-15 2010-June-16 2010-June-17 2010-June-3 2010-June-2 2010-June-1 

Estou tentando encontrar todas as instâncias que estão entre as marcas

Isto é o que eu tenho:

 $pattern = "/(.*?)/"; preg_match_all($pattern, $_POST['exclude'], $matches); foreach($matches as $deselect){ foreach ($deselect as $display){ echo $display."
"; } }

É isso que ele retorna:

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

Por que está dobrando, e como eu evito isso?

Não use regex para analisar xml / html …

Com isso dito, o problema é porque a estrutura de correspondência se parece com:

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

Então, em vez de fazer o seu foreach, faça um:

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

ou use o sinalizador PREG_SET_ORDER para preg_match_all, o que resultará em uma estrutura de matriz como:

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

Então, seu foreach se tornaria:

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

tente usar $matches[0] vez de apenas $matches .

Eu estava tendo o mesmo problema

Não é uma solução regex, mas você pode remover duplicado como este:

 array_unique($matches);