2010-05-25 34 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"