在http_build_query()中保留单引号?

时间:2010-05-25 16:20:41

标签: php

我想使用http_build_query将数组更改为html标记属性。问题是,它将我的单引号值更改为%27。所以,如果我有

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

我得到了

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

我怎样才能解决这个问题?

5 个答案:

答案 0 :(得分:3)

您可以在http_build_query

前面添加urldecode()

像:

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

答案 1 :(得分:3)

http_build_query()旨在将参数数组转换为网址。不要构建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')); ?>>
    
  3. 会让你:

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

答案 2 :(得分:0)

我猜你可以绕过这个结果rawurldecode(),但这真的不是http_build_query的目的。并且它不会在名称/值对之间放置&,使得输出不能用作input元素吗?

您可以使用其中一个XML类来执行此操作,但我不确定这是值得的。你在哪里使用它?

答案 3 :(得分:0)

使用此功能的数组中不需要引号:

用于从简单数组创建HTML属性字符串(带引号)的单行程序:

$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"

实施例

val trueColumn = lit(true)

答案 4 :(得分:0)

使用递归函数创建隐藏的INPUT:

$buildInputs = function($params, $prefix = '') use (&$buildInputs) {
    foreach ($params as $k => $v) {
        if (is_array($v)) {
            $buildInputs($v, $k);
        } else {
            if ($prefix) {
                $k = $prefix.'['.$k.']';
            }
            echo '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'">';
        }
    }
};
$buildInputs($postdata);