Увеличение для комбинации AZ и 0-9 с неизвестным форматом

0

Я получил таблицу, чтобы сохранить номер начала счета, который может позволить пользователю определить в любом формате, например:

ABC123

AZ2D20D7S99

но заставит пользователя закончить с номером

я получил таблицу, чтобы сохранить все созданные счета-фактуры с auto_increment

поэтому теперь мне нужно отобразить номер счета-фактуры с помощью

номер счета-фактуры + идентификатор счета-фактуры auto_increment

Например, я выбрал идентификатор счета 11 из db, номер счета-фактуры должен быть

ABC134

AZ2D20D7S110

Я думал, что можно использовать preg_match и preg_replace, но нет стандартного формата для стартового номера, поэтому я думаю, что это невозможно, если нет стандартного формата, верно?

Теги:
preg-match

3 ответа

0
Лучший ответ

Вы сказали, что вы вынуждаете пользователя заканчиваться номером, так что это какой-то стандартный формат, который вы можете использовать в RegEx.

$regs = array();
$data="AZ2D20D7S110";
preg_match('/(.*?)(\d*\z)/', $data, $regs);
// use $regs[1] for matched number, increment it and append it $regs[0]
0

При автоинкрементах можно указать префикс в другом столбце и сделать PK комбинированным индексом столбца. Это имеет дополнительное преимущество: вам не нужен код для его обслуживания или запроса и отображения данных: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

  • 0
    посмотрим на это, но я думаю, что это не полезно в моем случае, потому что префикс должен иметь возможность редактировать в любое время
0

Я бы использовал preg_match чтобы получить конечный номер, и preg_replace чтобы заменить его новым номером:

$autoId = 11; /* this is the auto id from the database */
$id = "ABC134"; /* this is the user input */

/* find the trailing number and store it in $number */
preg_match("/[^\d]+(\d+)$/", $id, $matches);
$number = $matches[1];

/* increase the number by the database id */
$newNumber = $number + $autoId;

/* replace the old number with the new number */
echo preg_replace("/\d+$/", $newNumber, $id);

Объяснение шаблона /[^\d]+(\d+)$/:

  • [^\d]+ соответствует одному или нескольким десятичным символам
  • (\d+)$ и затем сопоставить один или несколько десятичных символов, которые должны быть в конце строки ($)
  • в $matches[1] сохраняется совпадающая строка внутри первой скобки
  • 0
    это нормально для случая ABC134, но AZ2D20D7S99 будет преобразован в AZ2D20D7S121, что неправильно
  • 0
    нет, результат верный даже для AZ2D20D7S99, я только что проверил.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню