2

スピンされたテキストをphpページにきちんと出力する必要があります。{hi|hello|greetings} 形式のプレスパン テキストが既にあります。他の場所で見つけたphpコードがありますが、2つの{{が来る文レベルで紡がれたテキストを出力しません。修正が必要なコードは次のとおりです。

<?php

function spinText($text){
    $test = preg_match_all("#\{(.*?)\}#", $text, $out);

    if (!$test) return $text;

    $toFind = Array();
    $toReplace = Array();

    foreach($out[0] AS $id => $match){
    $choices = explode("|", $out[1][$id]);
    $toFind[]=$match;
    $toReplace[]=trim($choices[rand(0, count($choices)-1)]);
    }

    return str_replace($toFind, $toReplace, $text);
}

echo spinText("{Hello|Hi|Greetings}!");;

?>

出力はランダムに選択された単語になります: Hello OR Hi OR Greetings.

ただし、文レベルのスピンがあると、出力がめちゃくちゃになります。例えば:

{{hello|hi}.{how're|how are} you|{How's|How is} it going}

出力は

{hello.how're you|How is it going}

ご覧のとおり、テキストは完全に回転していません。

ありがとうございました

4

1 に答える 1

3

これは再帰的な問題であるため、正規表現はそれほど優れていません。ただし、再帰的なパターンが役立つ場合があります。

function bla($s)
{
    // first off, find the curly brace patterns (those that are properly balanced)
    if (preg_match_all('#\{(((?>[^{}]+)|(?R))*)\}#', $s, $matches, PREG_OFFSET_CAPTURE)) {
        // go through the string in reverse order and replace the sections
        for ($i = count($matches[0]) - 1; $i >= 0; --$i) {
            // we recurse into this function here
            $s = substr_replace($s, bla($matches[1][$i][0]), $matches[0][$i][1], strlen($matches[0][$i][0]));
        }
    }
    // once we're done, it should be safe to split on the pipe character
    $choices = explode('|', $s);

    return $choices[array_rand($choices)];
}

echo bla("{{hello|hi}.{how're|how are} you|{How's|How is} it going}"), "\n";

参照:再帰的パターン

于 2013-02-23T06:29:02.743 に答える