在PHP、HTML或XML中,%S是什么意思?

38
我正在查看Webmonkey的PHP和MySql教程,第2课。 我认为这是一个php文字。 %s是什么意思? 它在while循环中的print_f()函数中,在至少前几个代码块中都有。 printf("<tr><td>%s %s</td><td>%s</td></tr>n", ...
5个回答

62

使用printf或sprintf时,由%符号前导的字符被称为占位符(或令牌)。它们将被传递作为参数的变量所替换。

示例:

$str1 = 'best';
$str2 = 'world';

$say = sprintf('Tivie is the %s in the %s!', $str1, $str2);
echo $say;

这将输出:

Tivie是世界上最好的!

注意:还有更多的占位符(%s表示字符串,%d表示十进制数字等)


顺序:

传递参数的顺序很重要。如果你把$ str1和$ str2切换,那么输出结果也会改变。

$say = sprintf('Tivie is the %s in the %s!', $str2, $str1); 

它将打印

"Tivie是最好的世界!"

但是,您可以像这样更改参数的读取顺序:

$say = sprintf('Tivie is the %2$s in the %1$s!', $str2, $str1);

这将正确地打印句子。


另外需要注意的是,PHP是一种动态语言,不需要(也不支持)显式类型定义。这意味着它根据需要调整变量类型。在sprint中,这意味着如果您将“字符串”作为数字占位符(%d)的参数传递,该字符串将被转换为数字(int、float等),这可能会导致奇怪的结果。以下是一个示例:

$onevar = 2;
$anothervar = 'pocket';
$say = sprintf('I have %d chocolate(s) in my %d.', $onevar, $anothervar);
echo $say;

这将会打印

我有2个巧克力在我的0里。

更多相关内容请阅读PHP文档


我认为你的示例和Ned的解释一起构成了一个相当扎实的答案。问题是:如果我写sprintf('Tivie is the %s in the %s!', $str2, $str2);,它会输出"Tivie is the world in the best!"吗? - Wolfpack'08
1
它将输出"Tivie是世界中的世界",因为str2 = world。 - Tivie
2
是的。虽然您可以随意命名变量,但传递它们的顺序很重要。第一个占位符接受第一个传递的参数的值,第二个占位符接受第二个参数的值,以此类推。百分号后面的字母告诉sprint它是什么类型的变量(整数、字符串等)。 - Tivie
1
嗯...这里有一个列表http://en.wikipedia.org/wiki/Comparison_of_server-side_JavaScript_solutions - Tivie
我们如何处理:$str = "tst"; sprintf("恭喜您完成 %s 的基本安装!\n\n感谢您选择 %s!", $str, $str); - Pankaj Bisht
显示剩余2条评论

12

printf 中的 %s 是用于将数据插入到字符串中的占位符。向 printf 提供的额外参数是要插入的值。它们按照位置与占位符关联: 第一个占位符得到第一个值,第二个得到第二个值,以此类推。


1
顺便提一下,这个的正确术语是字符串插值。+1 - Mike Christensen
与C语言的“printf”具有相同的语法,显然。 - Fabrício Matté

6

%s是一种类型说明符,在%s情况下将替换为值(字符串)。

除了%s,您还可以使用其他说明符,其中最常见的如下:

d - 参数被视为整数,并显示为(有符号)十进制数。

f - 参数被视为浮点数,并显示为浮点数(区域设置感知)。

s - 参数被视为字符串并显示为字符串。


3
$num = 5; 
$location = 'tree';

$format = 'There are %d monkeys in the %s'; 
echo sprintf($format, $num, $location); 

输出结果为:“树上有5只猴子。”


1
感谢您的编辑,Ned。我进行了四次编辑,但仍然无法正常工作。Markdown 可能出了一些问题。 - David

2
printf()sprintf()函数会将格式化的字符串写入到变量中。 以下是语法:
sprintf(format,arg1,arg2,arg++)

格式:

  • %% - 返回百分号
  • %b - 二进制数
  • %c - 根据ASCII值返回字符
  • %d - 有符号十进制数(负数、零或正数)
  • %e - 科学计数法(小写)(例如1.2e+2)
  • %E - 科学计数法(大写)(例如1.2E+2)
  • %u - 无符号十进制数(大于或等于零)
  • %f - 浮点数(与本地设置相关)
  • %F - 浮点数(不受本地设置影响)
  • %g - %e和%f中较短的一个
  • %G - %E和%f中较短的一个
  • %o - 八进制数
  • %s - 字符串
  • %x - 十六进制数(小写字母)
  • %X - 十六进制数(大写字母)

arg1:

  • 要插入到格式字符串中第一个%-sign的参数。(必需的。)

arg2:

  • 要插入到格式字符串中第二个%-sign的参数。(可选的)

arg++:

  • 要插入到格式字符串的第三个、第四个等%-sign的参数。(可选的)

示例1:

$number = 9;
$str = "New York";
$txt = sprintf("There are approximately %u million people in %s.",$number,$str);
echo $txt;

这将输出:

纽约有大约9百万人口。

在主字符串中,arg1arg2arg++参数将被插入到百分号(%)符号中。该函数是“逐步”工作的。在第一个%符号处,插入arg1,在第二个%符号处,插入arg2,以此类推。

注意:如果%符号多于参数,则必须使用占位符。占位符插入在%符号之后,由参数编号和“\$”组成。让我们看另一个例子:

例2

$number = 123;
$txt = sprintf("With 2 decimals: %1\$.2f
<br>With no decimals: %1\$u",$number);
echo $txt;

这将输出:

保留2位小数:123.00
不保留小数:123

另一个重要的提示是:

使用 printf()sprintf() 函数时,转义字符不是反斜杠 '\',而是百分号 '%'. 例如,如果要打印 '%' 字符,则需要对其进行转义:

printf('%%%s%%', 'Nigeria Naira');

这将输出:

%Nigeria Naira%

欢迎查阅官方PHP文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接