PHP字符串函数之 sscanf echo print sprintf vsprintf printf vprintf fprintf vfprintf


#1

PHP字符串函数之 sscanf echo print sprintf vsprintf printf vprintf fprintf vfprintf

标签:PHP字符函数 PHP字符串输入输出


  • sscanf -- 根据指定格式解析输入的字符
  • echo -- 输出一个或多个字符串
  • print -- 输出字符串
  • sprintf -- 返回格式化字符串
  • vsprintf -- 返回格式化字符串 (参数为数组)
  • printf -- 直接输出格式化字符串
  • vprintf -- 直接输出格式化字符串 (参数为数组)
  • fprintf -- 将格式化后的字符串写入到流
  • vfprintf -- 将格式化后的字符串写入到流 (参数为数组)

sscanf

mixed sscanf ( string $str , string $format [, mixed &$... ] )

这个函数 sscanf() 类似 printf()的输入版。
sscanf() 读取字符串str 然后根据指定格式format解析, 格式的描述文档见 sprintf()。

参数说明

str
将要被解析的 字符串。
format
下面列出了与sprintf()不同的部分,其他的参考**sprintf()**
1. 函数不区分语言地区
2. F, g, G 和 b 不被支持.
3. D 表示十进制数字.
4. i 表示整形的转换
5. n 表示到目前为止的字符数
...
可以选参数,将以引用方式传入,它们的值将被设置为解析匹配的值

返回值

如果仅传入了两个参数给这个函数,解析后将返回一个数组,否则,如果可选参数被传入,这个函数将返回被设置了值的个数
如果format存在的子字符串比 str内可用的多, -1 将被返回.

注意

指定的格式字符串中的任意空白匹配输入字符串的任意空白.也就是说即使是格式字符串中的一个制表符 \t 也能匹配输入 字符串中的一个单一空格字符

示例

//不区分语言地区
<?php
$current_date = "2016年 1月 8日";
$var = sscanf($current_date, "%d%s %d%s %d%s");
var_dump($var);
/*
输出
array
  0 => int 2016
  1 => string '年' (length=2)
  2 => int 1
  3 => string '月' (length=2)
  4 => int 8
  5 => string '日' (length=2)
*/
?>

/*D 表示十进制数字.(%D 与 %d相同)
因为在PHP源码中'd'与'D'代码是一样的
	case 'd':
	case 'D':
		op = 'i';
		base = 10;
		fn = (long (*)())strtol;
		break;
*/
<?php
$hex = 0xFF;
$var = sscanf($hex, "%d");
var_dump($var);
/*
输出
array
  0 => int 255
*/

//D 无法识别字符串中的16进制
$hex = "0xFF";
$var = sscanf($hex, "%d");
var_dump($var);
/*
输出
array
  0 => int 0
*/
?>

// i 可以识别字符串中的16进制
<?php
$hex = "0xFF";
$var = sscanf($hex, "%i");
var_dump($var);
/*
输出
array
  0 => int 255
*/
?>

//n 表示到目前为止的字符数,一个中文字符相当于两个英文字符
<?php
$number = "0123456789 八个字符";
$var = sscanf($number, "%s %n%s%n");
var_dump($var);
/*
输出
array
  0 => string '0123456789' (length=10)
  1 => int 11
  2 => string '八个字符' (length=8)
  3 => int 19
*/
?>

//传入参数
<?php
$name = "";
$age = 0;
$name_age = "zhangsan 19";
$num = sscanf($name_age, "%s %d", $name, $age);
var_dump($num);  // int 2  (返回值为参数个数)
var_dump($name); // string 'zhangsan' (length=8)
var_dump($age);  // int 19
?>

echo

void echo ( string $arg1 [, string $... ] )

参数说明

arg1
要输出的参数
...

返回值

没有返回值。

注意

echo 不是一个函数(它是一个语言结构), 因此你不一定要使用小括号来指明参数,单引号,双引号都可以。
echo (不像其他语言结构)没有表现得像一个函数, 所以不能总是被用在一个函数的上下文。
另外,如果你想给echo 传递多个参数, 那么就不能使用小括号。

echo 也有一个快捷用法,你可以在打开标记前直接用一个等号。
在 PHP 5.4.0 之前,必须在php.ini 里面启用 short_open_tag 才有效。

I have <?=$foo?> foo.

示例

//普通输出
echo "Hello World"; 

//下面两条,在网页中都是在一行显示,但是查看源文件的话,会看到是按格式输出的
echo "This spans
multiple lines. The newlines will be
output as well"; 

echo "This spans\nmultiple lines. The newlines will be\noutput as well.";

//转义双引号
echo "Escaping characters is done \"Like this\".";

//输出变量名 使用单引号
echo 'foo is $foo'; // foo is $foo

//输出变量值 使用双引号
$foo = "foobar";
echo "foo is $foo"; // foo is foobar

//输出数组中的元素
$baz = array("value" => "foo");
echo "this is {$baz['value']} !";// this is foo !
echo "this is $baz !"; // this is Array !

//输出多个变量
$foo = "foobar";
$bar = "barbaz";
echo $foo,$bar; //foobarbarbaz

//按格式输出多行
//仍然是在网页中都显示在一行,但是查看源文件的话,会看到是按格式输出的
echo <<<END
This uses the "here document" syntax to output
multiple lines with $variable interpolation. Note
that the here document terminator must appear on a
line with just a semicolon. no extra whitespace!
END;

//echo 与 print区别
$some_var = true;
($some_var) ? echo 'true' : echo 'false'; // PHP报错
($some_var) ? print 'true' : print 'false'; // true
//不过可以用另外一种写法
echo $some_var ? 'true': 'false';
?>

<?php
//因为是一个语言结构而不是一个函数,不能被 变量函数(variable functions) 调用。
$func = "strpos";
echo $func("0123456",'6'); // int 6

$func = "echo";
$func "123"; //PHP报错
?>

print

int print ( string $arg )

参数说明

arg
要输出的参数

返回值

总是返回 1。

注意

print 实际上不是一个函数(它是一个语言结构),因此你不使用圆括号来括起它的参数列表也可以。

示例

<?php
print("Hello World"); //Hello World
print "Hello World";  //Hello World

//在网页中显示在一行,但是查看源文件的话,会看到是按多行输出的可以
print "This spans
multiple lines. The newlines will be
output as well";

/*print基本与echo使用方法相同,处了echo 没有返回值,print 总是返回1以外
还有下面的区别,其他使用可以参见echo的使用*/
$some_var = true;
($some_var) ? echo 'true' : echo 'false';   // PHP报错
($some_var) ? print 'true' : print 'false'; // true
?>

sprintf

string sprintf ( string $format [, mixed $args [, mixed $... ]] )

参数说明

format
这个format字符串由零个或多个指令组成,普通字符(除了'%')直接复制到返回值,规定的转换指令与参数一一对应。
%% - 百分比符号
%b - 二进制数
%c - ASCII码字符
%d - 带符号十进制数
%e - 科学计数法 (e.g. 1.2e+2)
%E - 科学计数法 (e.g. 1.2E+2)
%f - 浮点数(locale aware)
%F - 浮点数(non-locale aware, 看了PHP5.2的源码%F也调用了 localeconv())
%g - 较短的 %e 和 %f.
%G - 较短的 %E 和 %f.
%o - 八进制数
%s - 字符串
%u - 无符号十进制数
%x - 十六进制(小写)
%X - 十六进制(大写)

返回值

格式化后的字符串

注意

组合字符串的宽度超过一个字节字符集字符可能会导致意想不到的结果
(简单理解就是使用中文可能会出问题)

类型列表

示例

//%% 百分比符号
<?php
$str = sprintf("%");      // PHP Warning, Too few arguments 
$str = sprintf("%", 1);   // string '' (length=0)
$str = sprintf("%", 'a'); // string '' (length=0)
$str = sprintf("%%");     // string '%' (length=1)
?>

//%b 二进制数
<?php
$str = sprintf("%b", 'a'); // string '0' (length=1)
$str = sprintf("%b", 2);   // string '10' (length=2)
$str = sprintf("%b", 2.2); // string '10' (length=2)
$str = sprintf("%b", 0xa); // string '1010' (length=4)
$str = sprintf("%b", -2);  // string '11111111111111111111111111111110' (length=32)
?>

//%c ASCII码字符
<?php
$str = sprintf("%c", 'a');   // string '&#0;' (length=1)
$str = sprintf("%c", 'ccc'); // string '&#0;' (length=1)
$str = sprintf("%c", 65);    // string 'A' (length=1)
$str = sprintf("%c", 97);    // string 'a' (length=1)
$str = sprintf("%c", 97.5);  // string 'a' (length=1)
$str = sprintf("%c", -97);   // 乱码
?>

//%d 带符号十进制数, %u 无符号十进制数
<?php
$str = sprintf("%d", -8); // string '-8' (length=2)

$str = sprintf('There are %d monkeys in the tree', 65); 
//string 'There are 65 monkeys in the tree' (length=32)

$str = sprintf('There are %d monkeys in the tree', 65.01);
//string 'There are 65 monkeys in the tree' (length=32)

$str = sprintf("There are %08d monkeys in the tree", 65);
//string 'There are 00000065 monkeys in the tree' (length=38)

$str = sprintf("There are %'.8d monkeys in the tree", 65);
//string 'There are ......65 monkeys in the tree' (length=38)

$str = sprintf("There are %'.08d monkeys in the tree", 65);
//string 'There are 00000065 monkeys in the tree' (length=38)

/* %u 无符号十进制数 */
$str = sprintf("%d", -8); // string '4294967288' (length=10)
?>

//%e %E, %E 除了大小写其他与 %e 相同
<?php
$str = sprintf("%e", 8);              // string '8.000000e+0' (length=11)
$str = sprintf("%e", 8.123456789);    // string '8.123457e+0' (length=11)
$str = sprintf("%e", 'a');            // string '0.000000e+0' (length=11)
$str = sprintf("%e", 0xFF);           // string '2.550000e+2' (length=11)
$str = sprintf("%e", 08);             // string '0.000000e+0' (length=11) 8进制越界
$str = sprintf("%e", -8);             // string '-8.000000e+0' (length=12)
$str = sprintf("%.02e", 8.123456789); // string '8.12e+0' (length=7)
$str = sprintf("%0.2e", 8.123456789); // string '8.12e+0' (length=7)
$str = sprintf("%09.2e", 8.123456789);// string '008.12e+0' (length=9)
$str = sprintf("%09.9e", 8.123456789);// string '8.123456789e+0' (length=14)

/* %E */
$str = sprintf("%E", 8);              // string '8.000000E+0' (length=11)
?>

//%f==%F, %g==%G
<?php
$str = sprintf("%f", -8);             // string '-8.000000' (length=9)
$str = sprintf("%f", 8.123456789);    // string '8.123457' (length=8)
$str = sprintf("%0.2f", 8.123456789); // string '8.12' (length=4)
$str = sprintf("%0.9f", 8.123456789); // string '8.123456789' (length=11)
$str = sprintf("%f", 'a');            // string '0.000000' (length=8)
$str = sprintf("%f", 0xFF);           // string '255.000000' (length=10)
$str = sprintf("%015.9f", 8.123456789); // string '00008.123456789' (length=15)

/* %F */
$str = sprintf("%015.9F", 8.123456789); // string '00008.123456789' (length=15)

/* %g 比%f 默认少了一位 */
$str = sprintf("%g", 8.123456789);      // string '8.12346' (length=7) 
$str = sprintf("%015.9g", 8.123456789); // string '000008.12345679' (length=15) 

/* %G */
$str = sprintf("%G", 8.123456789);     // string '8.12346' (length=7) 
?>

//%o 八进制数
<?php
$str = sprintf("%o", 8);           // string '10' (length=2)
$str = sprintf("%o", 8.123456789); // string '10' (length=2)
$str = sprintf("%o", -8);          // string '37777777770' (length=11)
$str = sprintf("%o", 'c');         // string '0' (length=1)
$str = sprintf("%08o", 8.12);      // string '00000010' (length=8)
?>

//%x %X 十六进制
<?php
$str = sprintf("%x", 10);     // string 'a' (length=1)
$str = sprintf("%x", 'a');    // string '0' (length=1)
$str = sprintf("%x", 10.15);  // string 'a' (length=1)
$str = sprintf("%x", -10.12); // string 'fffffff6' (length=8)
$str = sprintf("%09x", 10);   // string '00000000a' (length=9)
$str = sprintf("%08.01x", 10.12); // string '00000000' (length=8)
/* %X */
$str = sprintf("%X", 10);     // string 'A' (length=1)
?>

//%s 字符串
<?php
$str = sprintf("%s", 10);                    // string '10' (length=2)
$str = sprintf("%s", 10.123456789123456789); // string '10.123456789123' (length=15)
$str = sprintf("%08s", 10.12);               // string '00010.12' (length=8)
$str = sprintf('%s', -10.12);                // string '-10.12' (length=6)

$str = sprintf('[%s]', "Happy New Year");    // string '[Happy New Year]' (length=16)
$str = sprintf('[%18s]', "Happy New Year");  // string '[    Happy New Year]' (length=20) 右对齐
$str = sprintf('[%-18s]', "Happy New Year"); // string '[Happy New Year    ]' (length=20) 左对齐
$str = sprintf('[%018s]', "Happy New Year"); // string '[0000Happy New Year]' (length=20)
$str = sprintf("[%'#18s]", "Happy New Year");// string '[####Happy New Year]' (length=20)
$str = sprintf("[%'.18s]", "Happy New Year");// string '[....Happy New Year]' (length=20)
$str = sprintf("[%10.10s]", "Happy New Year");//string '[Happy New ]' (length=12)
$str = sprintf("[%.10s]", "Happy New Year"); // string '[Happy New ]' (length=12)
?>

vsprintf

string vsprintf ( string $format , array $args )

参数说明

format
关于 format 的描述,参见 sprintf()

返回值

格式化后的字符串

注意

作用与 sprintf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。

示例

$str = vsprintf("%04d-%02d-%02d", array('2016','01','15')); //string '2016-01-15' (length=10)

printf

int printf ( string $format [, mixed $args [, mixed $... ]] )

该函数与 sprintf() 的区别是 直接输出,不会返回字符串,而是返回输出字符串的长度
关于参数可参考 sprintf()

参数说明

format
关于 format 的描述,参见 sprintf()

返回值

返回输出字符串的长度。

示例

<?php
$num = 2.12;
$len = printf("%.1f",$num);
var_dump($len);
/* 输出
2.1
int 3
*/

$len = printf("There are %d monkeys in the tree", 65);
var_dump($len);
/* 输出
There are 65 monkeys in the tree
int 33
*/
?>

vprintf

int vprintf ( string $format , array $args )

该函数与 vsprintf() 的区别是 直接输出,不会返回字符串,而是返回输出字符串的长度,参数可参考 vsprintf()
作用与 printf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。

参数说明

format
关于 format 的描述,参见 sprintf()

返回值

返回输出字符串的长度。

示例

<?php
$len = vprintf("%04d-%02d-%02d", array('2016','01','15'));
var_dump($len);
/* 输出
2016-01-15
int 10
*/
?>

fprintf

int fprintf ( resource $handle , string $format [, mixed $args [, mixed $... ]] )

写入一个根据 format 格式化后的字符串到 由 handle 句柄指定的流中。

参数说明

handle
文件系统指针,最典型地是 fopen() 创建的 resource(资源)。
format
关于 format 的描述,参见 sprintf()

返回值

返回写入的字符串长度。

示例

<?php
if (!($fp = fopen('date.txt', 'w'))) {
	return;
}

$len = fprintf($fp, "%04d-%02d-%02d", 2016, 01, 15); // $len = 10
//输出 2016-01-15 到文件 date.txt中
?>

vfprintf

int vfprintf ( resource $handle , string $format , array $args )

写入一个根据 format 格式化后的字符串到 由 handle 句柄指定的流中。
作用与 fprintf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。

参数说明

handle
文件系统指针,最典型地是 fopen() 创建的 resource(资源)。
format
关于 format 的描述,参见 sprintf()

返回值

返回写入的字符串长度。

示例

<?php
if (!($fp = fopen('date.txt', 'w'))) {
	return;
}

$len = vfprintf($fp, "%04d-%02d-%02d", array('2016', '01', '15')); // $len = 10
//输出 2016-01-15 到文件 date.txt中
?>