1

javascriptの関数をphpに書き直そうとしていますが、機能していません。たぶん、ここの誰かが私がどこで間違っているのか教えてくれますか?前もって感謝します。

Javascript ...(動作関数)

var match;
var chords = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B','C','Db','D','Eb','E','F','Gb','G','Ab','A','Bb','B','C'];
var chords2 = ['C','Db','D','Eb','E','F','Gb','G','Ab','A','Bb','B','C','C#','D','D#','E','F','F#','G','G#','A','A#','C'];
var chordRegex = /(?:C#|D#|F#|G#|A#|Db|Eb|Gb|Ab|Bb|C|D|E|F|G|A|B)/g;
var rec = /\{(.*?)\}/g; // gets all info between { and }

function transposeUp(){
    var html = $('.yui-editor-editable').contents().find('body'); //gets the contents
    var matches = $(html).html().match(rec);/////Gets all matches within the html
    var text = $(html).html(); // html of the html var
    for (var i = 0; i < matches.length; i++) { /////foreach match do
        ///// initializes variables /////
        var currentChord = String(matches[i]); //// sets current chord 
        currentChord = currentChord.substring(currentChord.indexOf("{") + 1, currentChord.indexOf("}")); //sets current chord cont.
        var output = "";
        var parts = currentChord.split(chordRegex); // splits currentChord into parts in the chordRegex
        var index = 0;
        /////////////////////////////////
        while (match = chordRegex.exec(currentChord)) { // while the match is equal to the currentChord do
            var chordIndex = chords2.indexOf(match[0]); // find the position of the matched chord within the chords2 array
            output += parts[index++] + chords[chordIndex + 1]; // build the output
        }
        output += parts[index];
        text = text.replace(matches[i], '{'+output+'}'); //replace the text with the new chords
    }
    $(html).html(text); // set the html value as the new text
}

PHP..。

function transposeUp($songchart){
$chords1 = array('C','C#','D','D#','E','F','F#','G','G#','A','A#','B','C','Db','D','Eb','E','F','Gb','G','Ab','A','Bb','B','C');
$chords2 = array('C','Db','D','Eb','E','F','Gb','G','Ab','A','Bb','B','C','C#','D','D#','E','F','F#','G','G#','A','A#','C');
$chordRegex = "/(?:C#|D#|F#|G#|A#|Db|Eb|Gb|Ab|Bb|C|D|E|F|G|A|B)/";

  $matches = preg_match_all('#{.*(.*)}#U', $songchart, $chords);
  $chord = $chords[1];
  foreach($chord as $key => $value){ 
    $output = '';
    $parts = preg_split($chordRegex, $value);
    $index = 0;
    while(preg_match($chordRegex, $value, $note)){
        $chordIndex = strpos($chords2, $note[0]);
        $output .= $parts[$index++] . $chords1[$chordIndex + 1];
    }
    $output .= $parts[$index];
    $songchart = preg_replace($value, $output, $songchart);
  }
return($songchart);
}
4

1 に答える 1

1
$matches = preg_match_all('#{.*(.*)}#U', $songchart, $chords);

する必要があります:

$matches = preg_match_all('#\{(.*)\}#U', $songchart, $chords);

あなたの正規表現では、最初の.*ものは中括弧内のすべてを消費していたので、2番目のものは何も得られませんでした。

whileループがわかりません。$value変更されることはないので、ループはどのように終了しますか?

$chordIndex = strpos($chords2, $note[0]);

する必要があります:

$chordIndex = array_search($chords2, $note[0]);

strposは配列ではなく文字列を検索するためのものです。

$songchart = preg_replace($value, $output, $songchart);

する必要があります:

$songchart = str_replace($value, $output, $songchart);

$valueは正規表現ではないので。

これがすべてを行っているかどうかはわかりませんが、を使用するか、検索引数と置換引数に配列をpreg_replace_callback含む単一の引数を使用することで、単純化できると思います。str_replace

于 2012-09-28T03:38:51.460 に答える