2010-06-17 6 views
0

Une question de suivi à Get all text between tags with preg_match_all() or better function?match str_replace que première instance

Compte tenu des données POST suivantes:

2010-June-3 
<remove>2010-June-3</remove> 
2010-June-15 
2010-June-16 
2010-June-17 
2010-June-3 
2010-June-1 

Je vouloir supprimer seulement la première instance de 2010-Juin-3, mais ce qui suit le code supprime toutes les données.

$i = 1; 
$pattern = "/<remove>(.*?)<\/remove>/"; 
preg_match_all($pattern, $_POST['exclude'], $matches, PREG_SET_ORDER); 
    if (!empty($matches)) { 
     foreach ($matches as $match) { 
      // replace first instance of excluded data 
      $_POST['exclude'] = str_replace($match[1], "", $_POST['exclude'], $i); 
     } 
    } 

echo "<br /><br />".$_POST['exclude']; 

Ce echos:

<remove></remove> 
2010-June-15 
2010-June-16 
2010-June-17 
2010-June-1 

Il devrait faire écho:

<remove>2010-June-3</remove> 
2010-June-15 
2010-June-16 
2010-June-17 
2010-June-3 
2010-June-1 

Répondre

3

Vous devez utiliser preg_replace() à la place:

$_POST['exclude'] = preg_replace('/' . preg_quote($match[1], '/') . '/', "", $_POST['exclude'], 1, $i); 

La variable après la $ _POST [ » 'exclure'] est un limit variable, comme vous pouvez le voir dans le lien ci-dessus.

La fonction preg_quote() n'était pas nécessaire dans le champ de date, mais comme il s'agit d'une variable, il peut être nécessaire d'inclure les caractères d'expression régulière spéciaux.

+0

Kerry, vous voudrez peut-être fournir le paramètre '$ delimiter' pour' preg_quote', juste au cas où ... en plus d'appeler réellement 'preg_replace'. – salathe

+0

Bon point - merci. Je trouve cela drôle/triste que je n'ai pas remplacé le code avec preg_replace –

+0

Cela a fonctionné comme un champion. Je vous remercie! – kylex