使用sprintf输出XML标记

时间:2013-08-05 19:34:36

标签: php xml

我有一些XML模板,我试图使用PHP的sprintf(v.5.3.8-Win54)来填充;但是,我注意到sprintf似乎遇到了< 字符的问题。 似乎 < 字符后面需要一个空格,以便sprintf能够输出正确。我看了PHP sprintf documentation但除了之外我找不到任何特殊字符的引用。我使用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>  

*格式4确实是空白。

为什么 &lt; 字符不会被输出,除非它后面有空格?我想我可以使用find / replace为XML模板中的所有 &lt; 字符添加一个空格,但我宁愿找出为什么会发生这种情况。我有一种感觉,这将是我尚未遇到的基本知识;如果是的话,你能提供任何文件的参考吗?

有趣: 我必须在 &lt; 字符后添加空格,同时输入此问题Stackoverflow接口,以便它在FORMAT 5行中正确显示! Huuuuuuh ??!

*完整代码*

<?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);

?>

2 个答案:

答案 0 :(得分:1)

您可能希望在htmlspecialchars()

中包装字符串

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

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

答案 1 :(得分:0)

我想我理解这个问题;完全澄清我的想法:你直接在浏览器中查看sprintf()输出的结果 - 而不是通过命令行查看源模式,但实际上是“因为它显示”。

这解释了您的结果。我们以格式#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”。在这种特定情况下,<>是重要的=]