4.2.2 格式化字符串以便显示

PHP具有一系列可供使用的函数来重新格式化字符串,这些函数的工作方式是各不相同的。

1.使用HTML格式化:nl2br()函数

nl2br()函数将字符串作为输入参数,用XHTML中的<br/>标记代替字符串中的换行符。这对于将一个长字符串显示在浏览器中是非常有用的。例如,我们使用这个函数来格式化订单中的顾客反馈并将它返回到浏览器中:


<p>Your feedback(shown below)has been sent.</p>

<p><?php echo nl2br($mailcontent);?></p>


请记住,HTML将忽略纯空格,所以如果不使用nl2br()函数来过滤这个输出结果,那么它看上去就是单独的一行(除非浏览器窗口进行了强制的换行)。举例说明如图4-2所示。

4.2.2 格式化字符串以便显示 - 图1

图 4-2 使用PHP的nl2br()函数改进HTML中的长字符串显示

2.为打印输出而格式化字符串

到目前为止,我们已经用echo语言结构将字符串输出到浏览器。PHP也支持print()结构,它实现的功能与echo相同,但具有返回值(true或false,表示成功或失败)。

这两种方法都会打印一个字符串。使用函数printf()和sprintf(),还可以实现一些更复杂的格式。它们的工作方式基本相同,只是printf()函数是将一个格式化的字符串输出到浏览器中,而sprintf()函数是返回一个格式化了的字符串。

如果你以前曾经使用过C语言,会发现这些函数从概念的角度和C语言中的一样,但是,其语法与C语言的函数并不是完全一致的。如果没有使用过C语言,你也会慢慢习惯并会发现它们非常有用并且功能强大。

这些函数的原型如下所示:


string sprintf(string format[,mixed args…])

void printf(string format[,mixed args…])


传递给这两个函数的第一个参数都是字符串格式,它们使用格式代码而不是变量来描述输出字符串的基本形状。其他参数是用来替换格式字符串的变量。

例如,在使用echo时,我们把要用的变量直接打印至该行中,如下所示:


echo"Total amount of order is$total.";


要使用printf()函数得到相同的结果,应该使用如下语句:


printf("Total amount of order is%s.",$total);


格式化字符串中的%s是转换说明。它的意思是“用一个字符串来代替”。在这个例子中,它会被已解释成字符串的$total代替。如果保存在$total变量中的值是12.4,这两种方法都将它打印为12.4。

printf()函数的优点在于,可以使用更有用的转换说明来指定$total为一个浮点数,它的小数点后面应该有两位小数,如下所示:


printf("Total amount of order is%.2f",$total);


经过这行代码的格式化处理,存储在$total中的12.4将打印为12.40。

可以在格式化字符串中使用多个转换说明。如果有n个转换说明,在格式化字符串后面就应该带有n个参数。每个转换说明都将按给出的顺序被一个重新格式化过的参数代替。

如下所示:


printf("Total amount of order is%.2f(with shipping%.2f)",

$total,$total_shipping);


在这里,第一个转换说明将使用变量$total,而第二个转换说明将使用变量$total_shipping。

每一个转换说明都遵循同样的格式,如下所示:


%['padding_character][-][width][.precision]type


所有转换说明都以%开始。如果想打印一个“%”符号,必须使用“%%”。

参数padding_character是可选的。它将被用来填充变量直至所指定的宽度。该参数的作用就像使用计算器那样在数字前面加零。默认的填充字符是一个空格,如果指定了一个空格或0,就不需要使用“'”作为前缀。对于任何其他填充字符,必须指定“'”作为前缀。

字符“-”是可选的。它指明该域中的数据应该左对齐,而不是默认的右对齐。

参数width告诉printf()函数在这里为将被替换的变量留下多少空间(按字符计算)。

参数precision表示必须是以一个小数点开始。它指明了小数点后面要显示的位数。

转换说明的最后一部分是一个类型码。其支持的所有类型码如表4-1所示。

4.2.2 格式化字符串以便显示 - 图2

当在类型转换代码中使用printf()函数时,你可以使用带序号的参数方式,这就意味着参数的顺序并不一定要与转换说明中的顺序相同。例如:


printf("Total amount of order is%2\$.2f(with shipping%1\$.2f)",

$total_shipping,$total);


只要直接在“%”符号后添加参数的位置,并且以$符号为结束——在这个例子中,“2\$”意味着“用列表中的第二个参数替换”。这个方法也可以在重复参数中使用。

这些函数还有两种可替换的版本,分别是vprintf()和vsprintf()。这些变体函数接收两个参数:格式字符串和参数数组,而不是可变数量的参数。

3.改变字符串中的字母大小写

可以重新格式化字符串中的字母大小写。对于我们的示例应用程序而言,这个特性并不是非常有用的,但是我们可以来看一些简单的例子。

如果电子邮件中的主题行字符串是以$subject开始,可以通过几个函数来改变它的大小写。这些函数的功能概要如表4-2所示。该表的第一列显示了函数名,第二列描述了它的功能,第三列显示了如何在字符串$subject中使用它,最后一列显示了该函数的返回值。

4.2.2 格式化字符串以便显示 - 图3