2011-02-15 11 views
2

我想在有人輸入歌詞時創建PDF和絃圖表。歌詞將被輸入的格式是這樣的:使用preg_match_all創建和絃圖表

[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 

我擁有一切排序。目前,我只需要弄清楚如何extraxt所有每個和絃和絃本身的文字...

這裏是我當前的代碼:

$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 
     ) 

) 

回答

4

有趣的問題......這裏是一個可能的解決方案。我使用了你的正則表達式,但也用它來查看填充和絃需要多少空間。

<?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"; 
} 
+0

和絃可以是相當複雜的...'(\ W {1,3})'不考慮複雜的和絃如AM7 + 9或甚至一些華碩其是4個字符 – philwinkle

+0

如此簡單我並不熟悉和絃,但是我已經將常規表達式作爲常量替換,因此可以進行任何更改。 – Jacob

+0

傳奇!工作先走!非常感謝您的幫助! –

0

我想這就是你要找的的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