2010-09-03 14 views
0

Ma chaîne source est la suivante:match de Preg tous les gourmands à l'exception de la chaîne

{categories group_id="3"} 
{category_name} 
{/categories} 

{categories group_id="4"} 
{category_name} 
{/categories} 

Mon regex est la suivante:

preg_match('/{categories group_id="3"}(.*){\/categories}/s', $tagdata, $matches); 

qui se traduit par:

Array 
(
    [0] => Array 
     (
      [0] => {categories group_id="3"} 
    {category_name} 
    {/categories} 
    {categories group_id="4"} 
    {category_name} 
    {/categories} 
     ) 

    [1] => Array 
     (
      [0] => 
    {category_name} 
    {/categories} 
    {categories group_id="4"} 
    {category_name} 

     ) 
) 

Vous pouvez voir que la gourmandise est trop gourmande, et cela va jusqu'à la fin de la seconde instance. Ce que je me attends est la suivante:

Array 
(
    [0] => Array 
     (
      [0] => {categories group_id="3"} 
    {category_name} 
    {/categories} 
     ) 

    [1] => Array 
     (
      [0] => 
    {category_name} 

     ) 
) 

Répondre

3
.* greedy 
.*? non-greedy 
+0

Wow. Je me sens stupide. Merci. – Rob

0

D'accord avec @ user779

aussi une autre façon est d'ajouter un U (PCRE_UNGREEDY) modificateur à la fin de votre expression rationnelle qui fait toute quantificateurs paresseux.

preg_match('/{categories group_id="3"}(.*){\/categories}/sU', $tagdata, $matches); 

Plus d'infos ici: http://php.net/manual/en/reference.pcre.pattern.modifiers.php