2011-02-15 2 views
2

누군가 가사를 입력하면 PDF 코드 차트를 만들고 싶습니다. 가사가 입력됩니다 형식은 다음과 같습니다 preg_match_all을 사용하여 코드 차트 만들기

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 

내가 다른 모든이 : 나는 내 보낸 그래서 같은 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 

내가 각 코드의 변화를 추출 할 정렬. 순간 난 그냥

여기에 내 현재 코드의 ... 각각의 코드와 코드 자체 사이의 모든 텍스트를 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+)\[(\w{1,3})\](\w+)/i', 
    $lyrics_line, 
    $out); 
:
preg_match_all('/\[(\w{1,3})\]/i', 
    $lyrics_line, 
    $out); 

하지만 이전과 화음 후 텍스트를 선택하려고 할 때, 나는 그것을 알아낼 수 없습니다 ... 나는 다음과 같은 시도

코드와 가사를 선택할 수 있도록 어떤 코드가 필요합니까? 포맷 할 수 있습니까?

좋은 것입니다 결과의 정렬이 같은 것입니다 :이 당신이 찾고있는 preg_match를 생각

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

:

/(\[[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

관련 문제