在BASH中是否存在与read -i
相同的PHP功能,以便脚本可以提示用户并提供如下默认答案:
Are you doing ok? (yes/no): 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的第一部分(scheme,host,port),这样他就可以添加/编辑其余部分(路径,查询),片段。像这样:
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
答案 0 :(得分: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);
答案 1 :(得分:0)
您可以为预填充/填充编辑打包标准bash,并从主php cli脚本中调用它
bash script named xreadline:
#! /bin/bash
IFS="";read -r -p "$1" -i "$2" -e STRING;echo "$STRING"
main php cli script:
#!/usr/bin/php
<?php
function xreadline ($prompt,$prefill)
{
$on = exec ('./xreadline "'.$prompt.'" "'.$prefill.'"');
return $on;
}
$answer = xreadline ('Your answer: ', 'xyz');
echo $answer;
.....
这种方法完全支持UTF8而不是本机PHP readline。
答案 2 :(得分:0)
评论搞砸了我的代码所以这里是独立的php cli文件,函数调用“read”命令。 有点棘手,但希望能按原样运作。 : - )
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
..........
// Navigation properties
public virtual NotificationSetting NotificationSettings { get; set; }
}
public class NotificationSetting
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("User")]
public Guid Id { get; set; }
....
// Navigation properties
public virtual User User { get; set; }
}