我有一个句子需要随机更改花括号中的部分。重要的是,大括号内的值可以改变(就像在那里可以放任何单词一样),所以
$x = '{Please,|Just|If you can,} make so, that this
{incredible|cool|simple|important|useless} sentence {fast|correctly|instantly}
changed randomly every time'; //this is the string that needs to be broken up
当我使用
时$parts = explode('{', $x);
它给了我一个看起来像这样的数组
array([0] => [1] => {请,| Just |如果可以,}这样做,这个 [2] =>令人难以置信的|酷|简单|重要|无用}句子 [3] =>快速|正确|立即}每次随机更改)
哪个不起作用。
我所做的是:
$parts = [
['Please,','Just','If you can,'],
['incredible', 'cool','simple','important','useless'],
['fast','correctly','instantly'],
];
$p = [];
foreach ($parts as $key => $values) {
$index = array_rand($values, 1);
$p[$key] = $values[$index];
}
$x_one = $p[0] . ' make it so that ' . $p[1] . ' this sentence
changed ' . $p[2] . ' randomly every time.';
echo $x_one;
我必须从$parts
获取$x
,因为字符串$x
中的字词可能会发生变化。不知道从哪里去。
答案 0 :(得分:4)
您可以使用preg_replace_callback()
来捕获序列,使用|
进行拆分并返回随机值:
$x = '{Please,|Just|If you can,} make so, that this
{incredible|cool|simple|important|useless} sentence {fast|correctly|instantly}
changed randomly every time';
// catch all strings that match with {...}
$str = preg_replace_callback('~\{([^}]+)\}~', function($matches){
// split using |
$pos = explode('|', $matches[1]);
// return random element
return $pos[array_rand($pos)];
}, $x);
echo $str;
可能的输出:
正则表达式:
\{ # { character
( # capture group
[^}]+ # all character until }
) # end capture group
\} # } character
答案 1 :(得分:1)
在这些情况下,正则表达式非常有用。例如,它在解析器中用于查找令牌。
在这种情况下,您希望获得花括号之间的所有子串。 这就是诀窍:
Array
(
[0] => Array
(
[0] => {Please,|Just|If you can,}
[1] => {incredible|cool|simple|important|useless}
[2] => {fast|correctly|instantly}
)
[1] => Array
(
[0] => Please,|Just|If you can,
[1] => incredible|cool|simple|important|useless
[2] => fast|correctly|instantly
)
)
输出:
'/\{([^}]*)\}/
表达式/
表示:
\{
:这可能是任何角色([^}]+)
:以start curly brace开头\}
:一切都不是大括号(括号用于隔离匹配的表达式,这就是为什么结果在数组的索引号1中)/
:以大括号结束preg_replace
:它必须与第一个字符相同换句话说:花括号之间的任何东西。
您可以在$cfg['SaveDir']
或these notes处测试正则表达式。
但这还不够:你想要替换那些比赛。 preg_replace_callback
可以做到这一点,但这还不够,因为你还需要调用一些函数来选择一个随机子串。 <?php
$x = '{Please,|Just|If you can,} make so, that this
{incredible|cool|simple|important|useless} sentence {fast|correctly|instantly}
changed randomly every time';
echo preg_replace_callback(
'/\{([^\}]+)\}/',
function ($matches) {
$options = explode('|', $matches[1]);
return $options[array_rand($options)];
},
$x
);
可以做到这一点。
sqlite 3
答案 2 :(得分:0)
另一个approch看起来像这样:
{{1}}
答案 3 :(得分:0)
如果大括号内的值可以更改,事实上,最好将它们从模板中提取到数组中,就像您在问题中所做的那样。有了部分数组和模板字符串,您就可以使用array_map
和strtr
:
$parts = [
'%part1%' => ['Please,','Just','If you can,'],
'%part2%' => ['incredible', 'cool','simple','important','useless'],
'%part3%' => ['fast','correctly','instantly'],
];
$template = '%part1% make so, that this %part2% sentence %part3% changed randomly every time';
$result = strtr($template, array_map(function ($values) {
return $values[array_rand($values, 1)];
}, $parts));
这是the demo。