2010-05-25 55 views
0

我想使用http_build_query將數組更改爲html標籤屬性。問題是,它將我的單引號值更改爲%27。所以,如果我有在http_build_query()中保留單引號?

http_build_query(array("type"=>"'hidden'", ...), '', ' '); 

我得到

<input type=%27hidden%27 ...> 

我怎樣才能解決這個得到什麼?

回答

3

,你可以在http_build_query

像前加urldecode()。不建立HTML標籤。你可以做幾件事情:

  1. 添加所有手動

    <input type="<?php echo htmlspecialchars($array['type']); ?>" ... 
    
  2. 建立一個輔助函數

    function buildArgs($array) { 
        $ret = ''; 
        foreach ($array as $key => $value) { 
         $ret .= ' ' . htmlspecialchars($key, ENT_QUOTES) . '="' . htmlspecialchars($value) . '"'; 
        } 
        return trim($ret); 
    } 
    
    <input <?php echo buildArgs(array('type'=>'hidden', 'name'=>'foo')); ?>> 
    

會產生你:

<input type="hidden" name="foo" > 
+0

這似乎有點倒退,但它確實有效! – Matthew 2011-05-16 20:24:57

0

我想你可以繞過這個做rawurldecode()的結果,但這真的不是http_build_query的目的。並且不會在名稱/值對之間放置一個&,從而使輸出不可用作爲input元素?

你可以使用其中一個XML類來做到這一點,但我不確定這是值得的。你在哪裏使用這個?

<?php 
    urldecode(http_build_query(array("type"=>"'hidden'", ...), '', ' ')); 
?>
+0

第三個參數是結果字符串的參數分隔符,我將其設置爲'''',現在不存在空格而不是&符號。基本上我想做一個'implode()',但也使用它們的鍵。我的數組是'array'('key'=>'value','key'=>'value',...)',我需要那裏的鍵。 – user151841 2010-05-25 16:39:01

3

http_build_query()旨在把參數數組到一個URL:

+0

爲什麼在'http_build_query()'幾乎完成我想要的功能時編寫一個新函數? 'urldecode()'使它完美工作。 – user151841 2010-05-25 16:43:11

+0

不,它不能正常工作。 'http_build_query()'將會跳過參數,因爲它們需要位於一個URL中(你可以通過urldecode進行解析)。它不會爲html轉義做任何事情。所以如果你使用它,你會引入XSS漏洞。只是因爲某些東西似乎有效,並不意味着你應該使用它... – ircmaxell 2010-05-25 16:45:35

+0

'urldecode(http_build_query(array_map('htmlspecialchars',&$ arrValues),'',''))''。爲什麼重新發明輪子? – user151841 2010-05-25 17:10:04

0

無引號是必需的陣列這個函數在:

一個班輪爲HTML的創建字符串屬性(帶引號)從一個簡單的數組:

$attrString = str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\""; 

實施例:

$attrArray = array("id" => "email", 
        "name" => "email", 
        "type" => "email", 
        "class" => "active large"); 

echo str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\""; 

// Output: 
// id="email" name="email" type="email" class="active large"