I guess it depends on the context: Where is the original serial number coming from? Will it always start 'xs-' or, if not, will the prefix always follow the same pattern (two letters and a dash)?
Assuming the prefix is constant, I might do something like this:
$serial = "xs-00001";
$xx = substr($serial, 3);
$new_serial = sprintf('xs-%1$05d', $xx + 1);
I've always read that PHP's string functions were faster than using regex, so I've stuck with substr. I've used sprintf to format the string simply as it's more compact - not sure if it's more or less understandable at a glance though. Also, I'm not explicitly casting $xx to an int, as adding 1 should cause PHP to do that, and I've specified the parameter as a decimal value to sprintf.
Pullo, just out of interest, how would you do this in Ruby?