0

我有一些我正在尝试使用 PHP 的 sprintf (v.5.3.8-Win54) 填充的 XML 模板;但是,我注意到 sprintf 似乎与<字符有问题。看来<字符后面需要跟一个空格,以便 sprintf 正确输出它。 我查看了PHP sprintf 文档,但除了%之外,我找不到任何对任何特殊字符的引用。我使用以下示例来echo sprintf($format1, $name, $age);说明问题:

$name = 'Lame';
$age = 1000;
$format1 = 'My name is %s. I am %d years old.';
$format2 = '<name> %s </name><age> %d </age>';
$format3 = 'name> %s /name>age> %d /age>';
$format4 = '<name %s </name<age %d </age';
$format5 = '<name> %s </name><age> %d </age>';

格式回显为:

FORMAT 1: My name is Lame. I am 1000 years old.  
FORMAT 2: Lame 1000  
FORMAT 3: name> Lame /name>age> 1000 /age>  
FORMAT 4:   
FORMAT 5: <name> Lame </name><age> 1000 </age>  

*FORMAT 4 确实是空白的。

任何想法为什么<字符不被输出,除非它后面有一个空格?我想我可以使用查找/替换为 XML 模板中的所有<字符添加一个空格,但我宁愿找出为什么会发生这种情况。我有一种感觉,这将是我还没有接触到的基本知识;如果是这样,您能否提供任何文档的参考资料?

有趣:在 Stackoverflow 界面中输入此问题时,我必须在<字符后添加一个空格,以便它正确显示在 FORMAT 5 行中!呜呜呜??!

* 完整代码 *

<?php   
$name = 'Lame';
$age = 1000;
$format1 = 'My name is %s. I am %d years old.';
$format2 = '<name> %s </name><age> %d </age>';
$format3 = 'name> %s /name>age> %d /age>';
$format4 = '<name %s </name<age %d </age';
$format5 = '< name> %s < /name>< age> %d < /age>';


echo 'FORMAT 1: ';
echo sprintf($format1, $name, $age);

echo '<br>';

echo 'FORMAT 2: ';
echo sprintf($format2, $name, $age);

echo '<br>';

echo 'FORMAT 3: ';
echo sprintf($format3, $name, $age);

echo '<br>';

echo 'FORMAT 4: ';
echo sprintf($format4, $name, $age);

echo '<br>';
echo '<br>';

echo 'FORMAT 5: ';
echo sprintf($format5, $name, $age);

?>
4

2 回答 2

1

您可能想将字符串包装在htmlspecialchars()

http://www.php.net/manual/en/function.htmlspecialchars.php

该功能会自动将您的 html 符号转换为编码等效项以显示在网页上。

于 2013-08-05T19:40:31.520 回答
0

我想我理解这个问题;完全澄清我的想法:您直接在sprintf()浏览器中查看输出的结果 - 不是通过查看源代码模式通过命令行,而是字面意思是“显示时”。

这解释了你的结果。让我们以格式 #2 为例:

<name> %s </name><age> %d </age>

如果你把这行文本保存在一个名为的文件中test.html,然后在网络浏览器中打开它,你会看到:

%s %d

这是因为浏览器将<name>和解释<age>为 HTML 标记,不会以文本形式显示它们。

这同样适用于 Format #4 以及它“根本不显示”的原因。第一个<name标签没有结束,因此浏览器假定该行中的所有文本都是属于该标签的属性。

对于以上所有内容,如果您在您正在查看的页面上“查看源代码” - 您将看到您期望/希望看到的正确输出。

如果您的意图是实际查看输出的文本表示,例如<name>Lame</name>,您可以使用 PHPhtmlentitieshtmlspecialchars在每个输出上:

echo 'FORMAT 2: ';
echo htmlentities(sprintf($format2, $name, $age));
echo '<br />';

这些函数将“将适用的字符转换为 HTML”。在这种特定情况下,<并且>是重要的=]

于 2013-08-05T20:03:03.323 回答