如何使用 Twig 生成随机字符串?

Posted

技术标签:

【中文标题】如何使用 Twig 生成随机字符串?【英文标题】:How to generate a random string using Twig? 【发布时间】:2015-12-30 21:30:28 【问题描述】:

我有一个包含优惠券代码的输入。用户可以填写自定义代码,但我想给他们一个默认代码。我现在有以下代码:

<input type="text" name="code" value=" form.code|default(RANDOM_CODE) ">

我想用一个随机字符串替换RANDOM_CODE

我认为这与问题无关,但form.code 包含原始优惠券代码。我使用相同的表单进行编辑。

根据 Twig 文档,可以使用 random() 生成随机数,甚至可以使用 random('abcdefgh...') 从字符串中获取随机字符,但我想生成具有特定长度的随机字符串。

我知道我至少可以使用两种方法来做到这一点:

    在控制器中生成默认随机码,然后将其传递给视图;或 创建一个带有函数的 Twig 扩展来为我生成随机字符串。

知道我很好奇是否有一种方法可以仅使用 Twig 的内置函数生成随机字符串。

【问题讨论】:

我认为可以使用 Twig 创建变量。您可以使用循环通过每次生成单个随机字符并附加来随机化多个字符。这行得通吗? @rnevius,是的。我在我的问题中说过。 @IsmaelMiguel,似乎可行。例如,我可以使用for 循环给出一个范围,例如% for i in 0..10 % 来创建一个长度为10 个字符的字符串。但是使用这种方法,我需要在循环中添加一个random('abcdefghi...')。我在想一些更紧凑的东西,但我几乎可以肯定这是不可能的。 听起来你有计划! 我经常通过简单地将随机数附加到前缀来执行此操作。例如:% set code='prefix-' ~ random() %。使用范围做长度。 10个字? 'prefix-' 是 7,还需要 3 个...random([100..999]) - 3 位随机数。 【参考方案1】:

此代码将生成一个 10 个字符的 base64 密码(A 到 Z 大小写,0 到 9,以及破折号和下划线)。这也使它对 url 友好。您可以根据自己的喜好更改参数。

% set randomPassword = [] %
% set alpha = 'abcdefghijklmnopqrstuvwxyz' %
% set numbers = '0123456789' %

% for i in 1..10 %
    % set randomCharacter = random(alpha ~ alpha|upper ~ numbers ~ '-_') %
    % set randomPassword = randomPassword|merge([randomCharacter]) %
% endfor %
% set randomPassword = randomPassword|join %


 randomPassword 

【讨论】:

这正是 twig 的初衷。 @Fluffy 可能不是为了这个目的,但是生成随机字符串在 html 中可以用于生成(任意的,但有时是必要的并且可能重复的)元素的唯一 ID,例如。我认为这个问题是有效的,尽管这里的目的是可疑的。【参考方案2】:

同意@Fluffy,您不应该在 twig 中这样做:您的优惠券代码是一个数据,将在 php 中处理,它必须在 php 中生成。

然而,我有一个直接在模板中生成唯一 ID 的用例:仅涉及模板时。

我得到了一个带有输入的表单。我的输入需要一个 id,但只能在同一模板内的标签的“for”属性中引用它们。

因为它是在循环中生成的,所以我提出了一个简单的:

% set domid='msg' ~ loop.index %

【讨论】:

嘿,@Pierre-Olivier Vares。感谢您的贡献,但这并不是我想要的。它不会生成具有特定长度的随机字符串。而且,正如您在问题中看到的那样,我知道“在控制器中生成默认随机代码,然后将其传递给视图”是一种可能的方法。当时只是好奇而已。但是,这似乎无法实现。 老实说,我的评论更多是为了回答类似的问题——尤其是我遇到的情况:)——而不是回答你的问题。我应该承认,这可能不是最好的方法。【参考方案3】:

树枝原生:

 random() 

访问下面的链接以获取树枝文档。 [检查这个]:https://twig.symfony.com/doc/3.x/functions/random.html

【讨论】:

如果您检查原始问题,您会看到它提到了random()。限制在于长度,无法使用它设置特定长度。 ok 一旦你得到了字符串你可以用你需要的数字切片它。 '12345'|slice(1, 2) 欲了解更多信息,请访问下方:twig.symfony.com/doc/2.x/filters/slice.html【参考方案4】:

这个“唯一标识”怎么样:

% set uid = "now"|date('Uv') %

使用 unix 时间戳 U 和毫秒 v 如果您迭代生成它们,您可能会通过连接 random() 来添加更多熵

【讨论】:

以上是关于如何使用 Twig 生成随机字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHP生成随机字符串

如何使用Lucene TestUtil进行随机Unicode字符串生成

如何使用Linux命令生成随机密码?

如何根据项目中的实际twig文件创建数据列表

JavaScript如何生成随机字母数字字符串

如何使用 PHP 创建随机字符串?