2009-10-12 132 views
1

我正在嘗試編寫一個快速字符串格式化例程以獲取未格式化的ISRC代碼,並在需要時添加連字符。PHP:使用printf格式化字符串

例如,ISRC USMTD9203901應該翻譯成美國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

你可以使用sscanfsprintf

$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

你可以試試這個:

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

您捕捉到組中的圖案由'('和')'然後在替換中使用該組。

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