PHP: форматирование строк с помощью printf - PullRequest
1 голос
/ 12 октября 2009

Я пытаюсь написать процедуру быстрого форматирования строки, чтобы взять неформатированный код ISRC и добавить переносы там, где это требуется.

Например, ISRC USMTD9203901 должно переводиться как US-MTD-92-03901 . Узор:

[A-Z]{2}-[A-Z]{3}-[0-9]{2}-[0-9]{5}

Я пытался реализовать это с помощью substr, и это привело к созданию следующего блока кода:

function formatISRC($isrc) {
    $country = substr($isrc, 0, 2);
    $label = substr($isrc, 2, 3);
    $year = substr($isrc, 5, 2);
    $recording = substr($isrc, 7);
    return $country.'-'.$label.'-'.$year.'-'.$recording;
}

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

Ответы [ 3 ]

3 голосов
/ 12 октября 2009

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

$parts = sscanf($isrc, '%2s%3s%2d%5d');
return sprintf('%s-%s-%02d-%05d', $parts[0], $parts[1], $parts[2], $parts[3]);

или короче с vsprintf:

return vsprintf('%s-%s-%02d-%05d', sscanf($isrc, '%2s%3s%2d%5d'));
0 голосов
/ 12 октября 2009
  1. Фильтр и проверка ввода
  2. Если все в порядке, переформатировать ввод и вернуть

Что-то вроде:

function formatISRC($isrc) {
    if(!preg_match("/([A-Z]{2})-?([A-Z]{3})-?([0-9]{2})-?([0-9]{5})/", strtoupper($isrc), $matches)) {
        throw new Exception('Invalid isrc');
    }    

// $matches contains the array of subpatterns, and the full match in element 0, so we strip that off.
    return implode("-",array_slice($matches,1));
}
0 голосов
/ 12 октября 2009

Вы можете попробовать это:

preg_replace(
    "/([A-Z]{2})([A-Z]{3})([0-9]{2})([0-9]{5})/",  // Pattern
    "$1-$2-$3-$4",                                 // Replace
    $isrc);                                        // The text

Вы фиксируете группу в шаблоне с помощью '(' и ')', а затем используете группу в замене.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...