我正在尝试编写一个快速的字符串格式化例程来获取未格式化的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;
}
我确信必须有一种更有效的方法来执行字符串操作。
答案 0 :(得分:3)
$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'));
答案 1 :(得分:0)
你可以试试这个:
preg_replace(
"/([A-Z]{2})([A-Z]{3})([0-9]{2})([0-9]{5})/", // Pattern
"$1-$2-$3-$4", // Replace
$isrc); // The text
您可以通过'('和')'捕获模式中的组,然后在替换中使用该组。
答案 2 :(得分:0)
喜欢的东西:
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));
}