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

时间:2014-01-19 12:09:06

标签: php command-line-interface readline

在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

3 个答案:

答案 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; }
    }