如何在 PHP 中为用户输入提供默认值?

问题描述 投票:0回答:3

是否有与 BASH 中的

read -i
相同的 PHP 功能,以便脚本可以提示用户并提供如下默认答案:

Are you doing ok? (yes/no): yes

其中“yes”是脚本提供的默认答案,用户可以删除并输入另一个答案。

readline
功能似乎没有它所需要的。还有其他方法可以做到这一点吗?

使用流似乎也不起作用:

<?php
echo "Are you doing ok? (yes/no): ";
$in = fopen('php://stdin', 'rw+');
fputs($in, 'yes'); // should be the default?
$answer = fgets($in);
fclose($in);
echo "\nYou entered: {$answer}\n";

fputs($in, 'yes');
行写入的内容将被忽略:

Are you doing ok? (yes/no): yes

You entered: 

我是否错误地使用了流?或者也许还有其他方法可以达到默认值?

编辑:

也许我把这个例子过于简化了。真正的问题不是简单的

yes/no
提示 - 这只是一个例子。让我再次强调:我的目标是提供与 read -i BASH 命令
完全相同的
功能。在我的具体情况下,
$answer
包含一个URL,因此我希望为用户提供URL的第一部分(方案、主机、端口),以便他可以添加/编辑其余部分(路径、查询) ,片段。像这样:

Enter url: http://www.example.com/foo/

现在用户用

bar/baz
补充路径,我们得到:

You entered: http://www.example.com/foo/bar/baz 

但另一方面,用户还应该可以选择删除网址的第一部分并提供完全不同的字符串:

Enter url: ftp://www.my-super-specific-domain.com/foo/bar
php command-line-interface readline
3个回答
2
投票

没有内置的方法可以做到这一点,因为编写一些代码来做到这一点非常简单:

function writeQuestion($question, $answers)
{
    echo $question . ' (' . implode('/', $answers) . '): ' . PHP_EOL;
}

function readAnswer($possibleAnswers, $defaultAnswer)
{
    $in = fopen('php://stdin', 'rw+');
    $answer = trim(fgets($in));

    if(!in_array($answer, $possibleAnswers))
    {
        return $defaultAnswer;
    }

    return $answer;
}

$question = 'Are you doing ok?';
$answers = array('yes', 'no');
$defaultAnswer = 'yes';

writeQuestion($question, $answers);
$answer = readAnswer($answers, $defaultAnswer);

0
投票

注释弄乱了我的代码,所以这里是独立的 php cli 文件,其中包含对“read”命令的函数调用。 有点棘手,但希望能按预期工作。 :-)

#!/usr/bin/php
<?php

function xreadline ($prompt,$prefill)
 {
   return exec ('/bin/bash -c \'read -r -p "'.$prompt.'" -i "'.$prefill.'" -e STRING;echo "$STRING";\'');
 }


echo "Prompt test :\n";
$output =  xreadline ("edit this prefilled prompt: ","prefilled stuff");

echo "\n";

echo $output;

0
投票

您可以包装标准 bash

read
进行预填充/填充编辑,并从主 php cli 脚本中调用它。

bash 脚本名为

xreadline
:

#! /bin/bash
IFS=""
read -r -p "$1" -i "$2" -e STRING
echo "$STRING"

主要 php cli 脚本:

#!/usr/bin/php
<?php

function xreadline ($prompt, $prefill)
{
  return exec ('./xreadline ' . escapeshellarg($prompt) . ' ' . escapeshellarg($prefill));
}

$answer = xreadline ('Your answer: ', 'xyz');
echo $answer;

...

此方法完全支持 UTF8,而不是本机 PHP readline。

© www.soinside.com 2019 - 2024. All rights reserved.