2010-11-30 3 views

ответ

25

Вы можете использовать preg_replace_callback как:

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

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

В основном вы подходите числовой части строки с использованием регулярных выражений \d+ и заменить его значение, возвращаемое функцией обратного вызова, который возвращает измененное значение.

Ideone link

В качестве альтернативы это может быть сделано с помощью preg_replace() с модификатором e как:

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

Ideone link

+0

+1 Я предпочитаю эту. – 2010-11-30 11:47:10

+0

что делать, если у меня есть строка типа "XXX-342"? он будет в $ match [0] или $ matches [1]? – tampe125 2010-11-30 11:51:33

0

Вот некоторый код Python, который делает то, что вы спрашиваете. Не слишком большой на моем PHP, но я посмотрю, смогу ли я преобразовать его для вас.

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

Если строка заканчивается цифровыми символами именно это просто ...

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

Это работает так же, как с «345ww», хотя результат не может быть то, что вы ожидаете.

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

@ tampe125

Этот пример, вероятно, лучший способ для ваших потребностей, если приращением строки, которые заканчиваются числами.

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

Вот пример, который работал для меня, делая предварительно приращение на величину

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

Приведенный выше код выведет HF0002

0

Если вы имеете дело со строками, которые имеют несколько число то это не так просто решить с помощью регулярных выражений, так как у вас могут быть числа, переполненные от одной числовой части к другой.

Например, если у вас есть номер INV00-10-99, который должен увеличиваться до INV00-11-00.

Я закончил с следующим:

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