2010-11-30 6 views

Répondre

25

Vous pouvez utiliser preg_replace_callback comme:

function inc($matches) { 
    return ++$matches[1]; 
} 

$input = preg_replace_callback("|(\d+)|", "inc", $input); 

Fondamentalement, vous correspondre à la partie numérique de la chaîne en utilisant l'expression rationnelle \d+ et le remplacer par la valeur retournée par la fonction de rappel qui renvoie la valeur incrémentée.

Ideone link

Sinon cela peut être fait en utilisant preg_replace() avec le modificateur e comme:

$input = preg_replace("|(\d+)|e", "$1+1", $input); 

Ideone link

+0

+1 Je préfère celui-ci. –

+0

Et si j'ai une chaîne comme "XXX-342"? ce sera dans $ matches [0] ou $ matches [1]? – tampe125

+3

@codaddict: Ne pensez-vous pas que le callback est un "petit" overhead là-bas? Pourquoi n'utilisez-vous pas le '+ 1' normal? – zerkms

0

est ici un code Python qui fait ce que vous demandez. Pas trop bien sur mon PHP, mais je verrai si je peux le convertir pour vous.

>>> import re 
>>> match = re.match(r'(\D*)(\d+)(\D*)', 'AF-1234') 
>>> match.group(1) + str(int(match.group(2))+1) + match.group(3) 
'AF-1235' 
+0

D'autres ont déjà répondu en PHP. Je vais laisser ceci ici au cas où quelqu'un le trouverait utile. – marcog

2

Si la chaîne se termine par des caractères numériques, il est ce simple ...

$str = 'AF-1234'; 
echo $str++; //AF-1235 

Cela fonctionne de la même manière avec « 345ww » si le résultat ne peut pas être ce que vous attendez.

$str = '345ww'; 
echo $str++; //345wx 

@ tampe125

Cet exemple est probablement la meilleure méthode pour vos besoins si la chaîne incrémenter qui se terminent par des chiffres.

$str = 'XXX-342'; 
echo $str++; //XXX-343 
3

Voici un exemple qui a fonctionné pour moi en faisant une augmentation avant la valeur

$admNo = HF0001; 
$newAdmNo = ++$admNo; 

Le code ci-dessus sortie HF0002

0

Si vous faites affaire avec des chaînes qui ont nombre multiple Il n'est donc pas facile de résoudre des parties avec regex, car vous pourriez avoir des nombres qui débordent d'une partie numérique à l'autre. Par exemple si vous avez un numéro INV00-10-99 qui doit être incrémenté à INV00-11-00.

J'ai fini avec les éléments suivants:

for ($i = strlen($string) - 1; $i >= 0; $i--) { 
    if (is_numeric($string[$i])) { 
    $most_significant_number = $i; 
    if ($string[$i] < 9) { 
     $string[$i] = $string[$i] + 1; 
     break; 
    } 
    // The number was a 9, set it to zero and continue. 
    $string[$i] = 0; 
    } 
} 

// If the most significant number was set to a zero it has overflowed so we 
// need to prefix it with a '1'. 
if ($string[$most_significant_number] === '0') { 
    $string = substr_replace($string, '1', $most_significant_number, 0); 
}