【问题标题】:Including JavaScript in PHP's json_encode()在 PHP 的 json_encode() 中包含 JavaScript
【发布时间】:2014-06-13 20:09:44
【问题描述】:

我需要使用 PHP 和 json_encode() 生成以下脚本。

var obj= {
    o1:123,
    o2: {
        o3: 456,
        o4: function() {return $( "#myID" ).val();}
    }
}

我的尝试如下。

<?php
$a=array(
    'o1'=>123,
    'o2'=>array(
        'o3'=>456,
        'o4'=>'function() {return $( "#myID" ).val();}'
    )
);
$json=json_encode($a);
?>
<script type="text/javascript"> 
    <?php echo("var obj={$json};");?>
    console.log(obj);
</script>

结果输出如下。属性周围的引号没有问题,但是,JavaScript 周围的引号将其呈现为字符串而不是 JavaScript。我显然不能不引用数组中的 JavaScript,因为它会导致 JSON 格式错误。

如何在 PHP 的 json_encode() 中包含 JavaScript?

var obj={
    "o1":123,
    "o2":{
        "o3":456,
        "o4":"function() {return $( \"#username\" ).val();}"
    }
};

【问题讨论】:

  • 您将无法使用 json_encode 生成 JavaScript 对象,因为 JSON 与 JavaScript 对象不同。
  • @DaveChen。是否可以使用任何从数组或对象获取输入的内置 PHP 函数为 JavaScript 对象创建适当的文本?

标签: javascript php json


【解决方案1】:

去掉围绕函数的引号怎么样?

<?php

$obj = array(
    'o1' => 123,
    'o2' => array(
        'o3' => 456,
        'o4' => 'function() {return $( "#myID" ).val();}',
        'o5' => 'function(param) {return $( "#myID" ).val();}'
    )
);
$json = json_encode($obj);

while ($func = strpos($json, '":"function(')) {
    $json = substr($json, 0, $func + 2) . substr($json, $func + 3);
    while ($quote = strpos($json, '"', $func + 2)) {
        $func = $quote + 1;
        if (substr($json, $quote - 1, 1) == "\\") {
            $json = substr($json, 0, $quote - 1) . substr($json, $quote);
            continue;
        }
        $json = substr($json, 0, $quote) . substr($json, $quote + 1);
        break;
    }
}

echo $json;

这会检查字符串是否以function( 开头,如果是,则删除双引号。

The result is a JSON(但仍可用作 JavaScript 对象):

{"o1":123,"o2":{"o3":456,"o4":function() {return $( "#myID" ).val();},"o5":function(param) {return $( "#myID" ).val();}}}

将此对象设置为变量后,您可以看到该函数注册良好。

这样,您仍然可以使用以前使用的相同技术:

<script type="text/javascript"> 
    <?php echo("var obj={$json};");?>
    console.log(obj);
</script>

【讨论】:

  • 谢谢戴夫。您和我的解决方案都能完美运行,但我喜欢您的解决方案,因为它不像我的那样需要多种方法。
【解决方案2】:

JSON 不支持函数。这是一种数据交换格式。也许您应该发送一些配置数据并让函数更改其行为。或者,由于此时您没有将其作为 AJAX 调用,因此只需将其回显:

<script type="text/javascript"> 
<?php echo("var obj={$json};");?>
<?php echo("obj.myFunc  = function..."); ?>
console.log(obj);
</script>

【讨论】:

  • 谢谢丹尼尔。我转换为 JSON 的实际数组要复杂得多,并且需要一些操作来创建它。我不是在尝试创建 JSON,而是尝试创建一个对象(实际上将与以下内容一起使用:jqueryvalidation.org/remote-method)。我已经创建了数组,只是无法回显它。也许需要进行一些复杂的解析以仅删除 PHP 呈现的 JSON 中 JavaScript 的引号,但这听起来很复杂。
【解决方案3】:

这就是我最终要做的。有点骇人听闻,我希望 Dave's 是一个更好的解决方案,但尚未对其进行测试。我会这样做的。

<?php

class fubar {
    public function json_encode_JS($array)
    {
        $array=$this->_json_encode_JS($array);
        $json=json_encode($array);
        $json=str_replace(array('"%','%"'), '', $json);
        $json=str_replace('\"', '"', $json);
        return $json;
    }
    private function _json_encode_JS($array)
    {
        foreach($array as $key => $value){
            if(is_array($value)){$array[$key]=$this->_json_encode_JS($value);}
            else {
                if(strpos($value, 'function(')===0){
                    $array[$key]='%'.$value.'%';
                }
            }
        }
        return $array;
    }
}

$array=array(
    'o1'=>123,
    'o2'=>'function() {return $("#myID").val();}',
    'o3'=>array(
        'o4'=>456,
        'o5'=>'function() {alert("Hello why don\'t you answer "+$("#myID").val());}'
    )
);

?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
<script type="text/javascript"> 
    <?php
    $obj=new fubar();
    echo('var obj='.$obj->json_encode_JS($array).';');
    ?>
    console.log(obj);
    obj.o3.o5();
</script>
<input id="myID" name="myID" type="text" value="hello">

【讨论】:

  • 我喜欢这种方法!我已经修改了我的代码以允许函数中的参数。 (搜索function( 而不是function())我可以看到我的方法实际上与您的方法相差不远。我删除了":"function( 处的第一个双引号,并删除了所有转义字符,然后删除了最后一个未转义的双引号。然而,您将分隔符 % 添加到以 function( 开头的任何字符串,json_encode,然后删除引号和分隔符,然后删除所有转义字符。唯一的问题是,如果你有一个带引号的字符串......
  • 这行不通。例如,array('a' =&gt; 'hello " world')。除此之外,它几乎是一样的。
猜你喜欢
  • 2012-02-29
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2011-10-02
  • 1970-01-01
相关资源
最近更新 更多