我需要在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}
正如您所看到的,文本尚未完全旋转。
谢谢
答案 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