我想创建一个PDF和弦图表时,有人输入歌词。将输入歌词的格式如下:
[B]Some lyrics blah blah [D]more lyrics blah
Lyrics without any chord charts blah blah
Some lyrics [C]blah blah more [E]lyrics blah然后我想提取每个和弦的变化,这样我就可以导出并在PDF中显示它,如下所示:
B D
Some lyrics blah blah more lyrics blah
Lyrics without any chord charts blah blah
C E
Some lyrics blah blah more lyrics blah我已经把其他的都整理好了。目前,我只需要弄清楚如何提取每个和弦之间的所有文本和和弦本身…
下面是我当前的代码:
$lyrics = '[B]Some lyrics blah blah [D]more lyrics blah
Lyrics without any chord charts blah blah
Some lyrics [C]blah blah more [E]lyrics blah';
$lyrics_html = '';
$x = 0;
$lyrics_lines = explode("\n", $lyrics);
// We've put each line into an array and now we will process each individually
foreach($lyrics_lines AS $lyrics_line) {
$x++;
if ($x > 1)
$lyrics_html .= '<br />';
// Check and see if an chords exist in this line
preg_match_all('/\[(\w{1,3})\]/i',
$lyrics_line,
$out);
if (!empty($out[0])) { // Found some chords, format it
print_r($out);
} else { // No chords found so just display the lyrics
$lyrics_html .= $lyrics_line;
}
}
echo $lyrics_html;不用担心,下面的代码会选择和弦
preg_match_all('/\[(\w{1,3})\]/i',
$lyrics_line,
$out);但是当我尝试在和弦之前和之后选择文本时,我似乎无法弄清楚……我尝试了以下几种方法:
preg_match_all('/(\w+)\[(\w{1,3})\](\w+)/i',
$lyrics_line,
$out);有什么想法,我需要什么代码,以便我可以选择和弦和歌词,以便我可以格式化?
这样的结果会很好:
Array
(
[0] => Array
(
[0] => [B]
[1] => [D]
)
[1] => Array
(
[0] => Some lyrics blah bla
[1] => more lyrics blah
)
)发布于 2011-02-16 07:00:48
有趣的问题。这里有一个可能的解决方案。我使用了您已有的正则表达式,但也使用了它来查看需要多少空格来填充和弦。
<?php
define('REGEX_CHORD', '[A-G].*?');
$input = '[B]Some lyrics blah blah [D]more lyrics blah
Lyrics without any chord charts blah blah
Some lyrics [C]blah blah more [E]lyrics blah';
$lines = explode("\n", $input);
echo '<pre>';
foreach($lines as $line) {
$chordline = '';
$tmpline = $line;
while(preg_match('~(.*)\[('.REGEX_CHORD.')\]~', $tmpline, $matches)) {
// Length before the chord shows how many spaces are required.
$chordline = str_repeat(' ', strlen($matches[1]))
.$matches[2]
.substr($chordline,
strlen($matches[2]) + 3 + strlen($matches[1]));
$tmpline = $matches[1];
}
echo $chordline."\n";
echo preg_replace('~\[('.REGEX_CHORD.')\]~', '', $line)."\n";
}发布于 2011-02-16 06:48:47
我想这就是你要找的preg_match:
/(\[[A-G].*?\])/
它捕获由方括号封装的任何弦和后面的符号。它甚至可以匹配平坦、锐化和修饰,如下所示:
[B]Some lyrics blah blah [D]more lyrics blah
Lyrics without any chord charts blah blah
Some lyrics [C]blah blah more [E]lyrics blah
[Bb]Some lyrics blah blah [Dm7+9]more lyrics blah
Lyrics without any chord charts blah blah
Some lyrics [C]blah blah more [Eb]lyrics blah请看这里的工作示例:http://regexr.com?2t408
https://stackoverflow.com/questions/5010358
复制相似问题