是否有与 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
没有内置的方法可以做到这一点,因为编写一些代码来做到这一点非常简单:
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);
注释弄乱了我的代码,所以这里是独立的 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;
您可以包装标准 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。