从句子级别的旋转文本取消固定php中的文本

时间:2013-02-23 05:29:59

标签: php regex

我需要在php页面中整齐地输出旋转文本。 我已经有{hi | hello | greetings}格式的prespun文本。 我有一个我在其他地方找到的PHP代码,但它没有输出句子级别的旋转文本,其中两个{{来。 这是需要修复的代码。

<?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或Hi或Greetings。

但是,如果句子级别旋转,则输出混乱。 E.g:

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

输出

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

正如您所看到的,文本尚未完全旋转。

谢谢

1 个答案:

答案 0 :(得分: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";

另请参阅:Recursive patterns