使用sprintf输出XML标记


Output XML tags using sprintf

我有一些XML模板,我正在尝试使用PHP的sprintf(v.5.3.8-Win54)填充这些模板;然而,我注意到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确实是空白的。

为什么<字符不会被输出,除非后面有空格?我想我可以在所有<使用find/replaceXML模板中的字符,但我更愿意从一开始就弄清楚为什么会发生这种情况。我有一种感觉,这将是我还没有遇到的基本知识;如果是,你能提供任何文件的参考资料吗?

有趣:我不得不在<字符,同时在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);
?>

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

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

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

我想我理解这个问题;为了完全阐明我的想法:您直接在浏览器中查看sprintf()输出的结果,而不是通过View Source模式通过命令行,而是字面上的"显示时"。

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

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

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

%s %d

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

这同样适用于格式#4以及为什么它"根本不显示"。第一个<name标记没有结束,因此浏览器假定该行中的所有文本都是属于所述标记的属性。

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

如果您的意图是实际看到输出的文本表示,例如<name>Lame</name>,那么您可以在每个输出上使用PHP的htmlentitieshtmlspecialchars

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

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