2010-11-30 14 views

Antwort

25

können Sie verwenden preg_replace_callback als:

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

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

Grundsätzlich Sie den numerischen Teil der Zeichenfolge übereinstimmen mit dem regex \d+ und ersetzen Sie es mit dem Wert, der durch die Callback-Funktion zurückgegeben, die den erhöhten Wert zurückgibt.

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

Ideone link

+0

+1 ich diese bevorzugen. –

+0

Was ist, wenn ich eine Zeichenfolge wie "XXX-342" habe? es wird in $ Übereinstimmungen [0] oder $ Übereinstimmungen [1] sein? – tampe125

+3

@codaddict: Denkst du nicht, dass Callback ein "kleiner" Overhead ist? Warum nicht normale '+ 1' verwenden? – zerkms

0

Hier einige Python-Code, der tut, was Sie fragen:

Ideone link

Alternativ kann dies als mit preg_replace() mit dem e Modifikator erfolgen. Nicht zu großartig auf meinem PHP, aber ich werde sehen, ob ich es für Sie konvertieren kann.

>>> 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

Andere haben bereits in PHP geantwortet. Ich lasse das hier für den Fall, dass jemand es nützlich findet. – marcog

2

Wenn die Zeichenfolge mit numerischen Zeichen endet es ist so einfach ...

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

, dass die gleiche Art und Weise mit ‚345ww‘ funktioniert, obwohl das Ergebnis möglicherweise nicht, was Sie erwarten.

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

@ tampe125

Dieses Beispiel ist wahrscheinlich die beste Methode für Ihre Bedürfnisse, wenn der String erhöht wird, die mit Zahlen beenden.

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

Hier ist ein Beispiel, das

, indem Sie eine Pre Schritt auf dem Wert für mich gearbeitet
$admNo = HF0001; 
$newAdmNo = ++$admNo; 

Der obige Code gibt HF0002

0

Wenn Sie mit Zeichenfolgen handelt, die mehrere Nummer haben Teile, dann ist es nicht so einfach, mit Regex zu lösen, da Sie Zahlen haben können, die von einem numerischen Teil zu einem anderen überlaufen. Wenn Sie beispielsweise eine Nummer INV00-10-99 haben, die auf INV00-11-00 erhöht werden soll

endete ich mit dem Follow-up:

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); 
} 
Verwandte Themen