首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用preg_match_all创建chord charts

使用preg_match_all创建chord charts
EN

Stack Overflow用户
提问于 2011-02-16 06:38:53
回答 2查看 261关注 0票数 2

我想创建一个PDF和弦图表时,有人输入歌词。将输入歌词的格式如下:

代码语言:javascript
复制
[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中显示它,如下所示:

代码语言:javascript
复制
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

我已经把其他的都整理好了。目前,我只需要弄清楚如何提取每个和弦之间的所有文本和和弦本身…

下面是我当前的代码:

代码语言:javascript
复制
$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;

不用担心,下面的代码会选择和弦

代码语言:javascript
复制
preg_match_all('/\[(\w{1,3})\]/i',
    $lyrics_line,
    $out);

但是当我尝试在和弦之前和之后选择文本时,我似乎无法弄清楚……我尝试了以下几种方法:

代码语言:javascript
复制
preg_match_all('/(\w+)\[(\w{1,3})\](\w+)/i',
    $lyrics_line,
    $out);

有什么想法,我需要什么代码,以便我可以选择和弦和歌词,以便我可以格式化?

这样的结果会很好:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
        [0] => [B]
        [1] => [D]
        )

    [1] => Array
        (
        [0] => Some lyrics blah bla
        [1] => more lyrics blah
        )

)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-16 07:00:48

有趣的问题。这里有一个可能的解决方案。我使用了您已有的正则表达式,但也使用了它来查看需要多少空格来填充和弦。

代码语言:javascript
复制
<?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";
}
票数 4
EN

Stack Overflow用户

发布于 2011-02-16 06:48:47

我想这就是你要找的preg_match:

/(\[[A-G].*?\])/

它捕获由方括号封装的任何弦和后面的符号。它甚至可以匹配平坦、锐化和修饰,如下所示:

代码语言:javascript
复制
[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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5010358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档