我正在用PHP创建一个吉他标签到rtttl(铃声文本传输语言)转换器.为了准备一个用于rtttl转换的吉他标签,我首先删除所有注释(注释为# - 并以 - #结尾),然后我有几行设置速度,注意调整和定义多个乐器(Tempo 120 \n定义吉他1 \n定义低音1等等,从标签中剥离并放在一边供以后使用.
现在除了吉他标签之外,我基本上什么都没有.每个标签都以其仪器名称为前缀,并附有之前提到的仪器名称.
有些时候我们有两个独立乐器的标签,因为它们要一起演奏,即吉他和低音吉他一起演奏.
示例1,标准吉他标签:
|Guitar 1
e|--------------3-------------------3------------|
B|------------3---3---------------3---3----------|
G|----------0-------0-----------0-------0--------|
D|--------0-----------0-------0-----------0------|
A|------2---------------2---2---------------2----|
E|----3-------------------3-------------------3--|
Run Code Online (Sandbox Code Playgroud)
例2,连接标签:
|Guitar 1
e|--------------3-------------------3------------|
B|------------3---3---------------3---3----------|
G|----------0-------0-----------0-------0--------|
D|--------0-----------0-------0-----------0------|
A|------2---------------2---2---------------2----|
E|----3-------------------3-------------------3--|
|
|
|Bass 1
G|----------0-------0-----------0-------0--------|
D|--------2-----------2-------2-----------2------|
A|------3---------------3---3---------------3----|
E|----3-------------------3-------------------3--|
Run Code Online (Sandbox Code Playgroud)
我已经考虑了其他识别选项卡的方法,没有可靠的结果.我希望那些做正则表达式的人可以帮我找到识别单个吉他标签的方法,如果可能的话,也可以将标签与多个连接在一起的乐器相匹配.
一旦选项卡在一个数组中,我将一次一行地将它们转换为rtttl行(在每个新行"\n"处展开).
我不想通过爆炸"\n \n"或类似的东西来分离文档中的吉他标签,因为它不识别吉他标签,而是识别标签之间的空间 - 而不是标签本身.
我现在已经搞乱了一个星期了,这是我唯一的主要举措.其他一切都相当简单.
截至目前,我已经尝试了许多正则表达式的变体.这是最新的测试样本之一:
<?php
$t = "
|Guitar 1
e|--------------3-------------------3------------|
B|------------3---3---------------3---3----------|
G|----------0-------0-----------0-------0--------|
D|--------0-----------0-------0-----------0------|
A|------2---------------2---2---------------2----|
E|----3-------------------3-------------------3--|
|Guitar 1
e|--------------3-------------------3------------|
B|------------3---3---------------3---3----------|
G|----------0-------0-----------0-------0--------|
D|--------0-----------0-------0-----------0------|
A|------2---------------2---2---------------2----|
E|----3-------------------3-------------------3--|
|
|
|Bass 1
G|----------0-------0-----------0-------0--------|
D|--------2-----------2-------2-----------2------|
A|------3---------------3---3---------------3----|
E|----3-------------------3-------------------3--|
";
preg_match_all("/^.*?(\\|).*?(\\|)/is",$t,$p);
print_r($p);
?>
Run Code Online (Sandbox Code Playgroud)
值得注意的是,在标签内部,破折号和#是,你可能还有字母,数字和标点符号的任何变化.每行的开头标记每个字符串的调整,其中一个不区分大小写:a,a#,b,c,c#,d,d#,e,f,f#,g或g.
在此先感谢您帮助解决这个最棘手的问题.
我真的很喜欢这个问题:-P.我玩得很开心.
这是我得到的:
<?php
$t = <<<EOD
|Guitar 1
e|--------------3-------------------3------------|
B|------------3---3---------------3---3----------|
G|----------0-------0-----------0-------0--------|
D|--------0-----------0-------0-----------0------|
A|------2---------------2---2---------------2----|
E|----3-------------------3-------------------3--|
|Guitar 1
e|--------------3-------------------3------------|
B|------------3---3---------------3---3----------|
G|----------0-------0-----------0-------0--------|
D|--------0-----------0-------0-----------0------|
A|------2---------------2---2---------------2----|
E|----3-------------------3-------------------3--|
|
|
|Bass 1
G|----------0-------0-----------0-------0--------|
D|--------2-----------2-------2-----------2------|
A|------3---------------3---3---------------3----|
E|----3-------------------3-------------------3--|
EOD;
GetTabs($t);
function GetTabs($tabString) {
$tabs = array();
$tabcount = 0;
$instrumentcount = 0;
$tabline = 0;
$tabStringArray = explode("\n", $tabString);
foreach ($tabStringArray as $tabStringRow) {
if (preg_match ('/^(?<snaretuningprefix>[bgdaeBGDAE#])+\|(?<tabline>[0-9-]+)\|/', $tabStringRow)) {
//Matches a tab line
//The tabline group can be expanded with characters for hammer on's, pull off's and whatnot
$tabs[$tabcount][$instrumentcount-1][$tabline] = $tabStringRow;
$tabline++;
continue;
}
if (preg_match ('/^\s\|\s+/', $tabStringRow, $matches)) {
//Matches ' |'
//Continuation of tab do nothing
continue;
}
if (preg_match ('/^\s\|(?<instrument>[A-z0-9\s]+)/', $tabStringRow, $matches)) {
//Matches an instrument line ' |Guitar 1'
$tabs[$tabcount][$instrumentcount]['instrumentname'] = $matches['instrument'];
$instrumentcount++;
$tabline = 0;
continue;
}
if (preg_match ('/^\s+/', $tabStringRow)) {
//Matches empty line
//new tab
$tabcount++;
$instrumentcount = 0;
continue;
}
}
print_r($tabs);
}
?>
Run Code Online (Sandbox Code Playgroud)
这个功能有点评论,我认为这并不难读.
这个输出:
Array
(
[0] => Array
(
[0] => Array
(
[instrumentname] => Guitar 1
[0] => e|--------------3-------------------3------------|
[1] => B|------------3---3---------------3---3----------|
[2] => G|----------0-------0-----------0-------0--------|
[3] => D|--------0-----------0-------0-----------0------|
[4] => A|------2---------------2---2---------------2----|
[5] => E|----3-------------------3-------------------3--|
)
)
[1] => Array
(
[0] => Array
(
[instrumentname] => Guitar 1
[0] => e|--------------3-------------------3------------|
[1] => B|------------3---3---------------3---3----------|
[2] => G|----------0-------0-----------0-------0--------|
[3] => D|--------0-----------0-------0-----------0------|
[4] => A|------2---------------2---2---------------2----|
[5] => E|----3-------------------3-------------------3--|
)
[1] => Array
(
[instrumentname] => Bass 1
[0] => G|----------0-------0-----------0-------0--------|
[1] => D|--------2-----------2-------2-----------2------|
[2] => A|------3---------------3---3---------------3----|
[3] => E|----3-------------------3-------------------3--|
)
)
)
Run Code Online (Sandbox Code Playgroud)