2010-11-30 13 views

Respuesta

25

Se puede utilizar como preg_replace_callback:

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

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

Básicamente que coinciden con la parte numérica de la cadena mediante la expresión regular \d+ y reemplazarlo con el valor devuelto por la función de devolución de llamada que devuelve el valor incrementado.

Ideone link

Alternativamente esto se puede hacer usando preg_replace() con el modificador e como:

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

Ideone link

+0

+1 prefiero éste. –

+0

¿Qué sucede si tengo una cadena como "XXX-342"? será en $ matches [0] o $ matches [1]? – tampe125

+3

@codaddict: ¿No crees que la devolución de llamada es un "pequeño" sobrecarga? ¿Por qué no usas '' 1' regular? – zerkms

0

Aquí hay un código Python que hace lo que se le pregunte. No es muy bueno en mi PHP, pero veré si puedo convertirlo para usted.

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

Otros ya han respondido en PHP. Dejaré esto aquí en caso de que alguien lo encuentre útil. – marcog

2

Si la cadena termina con caracteres numéricos es este sencillo ...

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

que funciona de la misma manera con '345ww' aunque el resultado no sea el esperado.

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

@ tampe125

Este ejemplo es probablemente el mejor método para sus necesidades si es incrementar cadena que termina con los números.

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

Este es un ejemplo que trabajó para mí haciendo un incremento previo en el valor de salida voluntad

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

El código anterior HF0002

0

Si se trata de cadenas que tienen un número múltiple partes, no es tan fácil de resolver con expresiones regulares, ya que puede tener números desbordados de una parte numérica a otra.

Por ejemplo, si tiene un número INV00-10-99 que debería incrementarse a INV00-11-00.

terminé con lo siguiente:

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); 
} 
Cuestiones relacionadas