2013-08-05 58 views
0

我有幾個XML模板,我試圖用PHP的sprintf(v.5.3.8-Win54)來填充;但是,我注意到sprintf似乎在處理字符時遇到了問題。 看起來 < 字符需要後面跟一個空格,以便sprintf正確輸出它。我看着PHP sprintf documentation,但除之外,我找不到任何特殊字符。我贊同用echo sprintf($format1, $name, $age);,藉以說明問題的例子如下:使用sprintf輸出XML標籤

$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確實出來爲空白。

任何想法,爲什麼<性格是不是被輸出,除非有下列它的空間?我想我可以使用find/replace爲XML模板中的所有字符添加空格,但我寧願找出爲什麼會發生這種情況。我有一種感覺,這將是我還沒有遇到的基本知識;如果是這樣,你能否提供任何文件的參考?

有趣:我有<後的字符添加一個空格,而打字了在#1接口這個問題,以便它在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); 

?> 
+0

我無法複製您的結果; CLI和瀏覽器(查看源代碼以查看實際結果)都會顯示預期的輸出。你是否展示了你在測試中使用的所有代碼? – newfurniturey

+0

@Prix - 添加

標籤只會更改字體。 –
                        
                            
    karol
                                
                            
                        
                    

+0

@newfurniturey - 在你的測試中,格式2與格式5相同嗎?在我的代碼之間唯一的區別是跟隨不到字符的空格。我沒有顯示的唯一代碼是每種格式的回顯。這些都是正確的,只是將格式變量更改爲$ format1,$ format2等... – karol

回答

0

我想我明白這個問題;以完全闡明我的想法:您直接在瀏覽器中查看sprintf()輸出的結果 - 不是通過查看源代碼模式通過命令行,而是從字面上「顯示」。

這解釋了你的結果。讓我們以格式#2例如:

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

如果你把這個文本確切的行並將其保存在一個名爲test.html文件,並在Web瀏覽器中打開它,你會看到:

%s %d 

這是因爲瀏覽器將<name><age>解釋爲HTML標記,並且不會以文本方式顯示它們。

這同樣可以應用於格式#4以及爲什麼它「根本不顯示」。第一個<name標籤沒有結束,所以瀏覽器假定該行中的所有文本都是屬於所述標籤的屬性。

對於上述所有情況,如果您在查看的頁面上顯示「查看源代碼」,則會看到您期望/希望看到的正確輸出。

如果你的目的是要真正看到輸出的文字表述,比如<name>Lame</name>,你可以使用PHP在每個輸出的htmlentitieshtmlspecialchars

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

這些功能將「轉換適用字符HTML」。在這個特定情況下,<>是重要的=]

+0

謝謝你解釋爲什麼會發生這種情況。我將sprintf輸出寫入了一個文件,所有內容都應該如此。一切都與世界再次正確......哦,哦! – karol