我正在尝试使用Json,PHP和jQuery创建一个带有可编辑标签的表单。
我已经在Json文件的问题中阅读了我的PHP表单。
我已经获取了表单的输出,将其序列化为Json,并将其传递给另一个PHP文件。
到那里之后,我想把我的json字符串,并替换它的位,使它匹配我原来的json布局,然后将其写回文件。
如果以下说明太长,请跳至步骤5以解决实际问题。
第1步。以下是读入表单的json(显然在真实文件中存在的问题比此更多):
{
"servers": {
"questions": [
{
"server": "server1",
"question":"Is the server running?",
"helptext":"It should be",
"answers": "Yes, No"
},
{
"server": "server2",
"question":"Is the server running?",
"helptext":"It should be",
"answers": "Yes, No"
}
]
}
}
第2步。我在这里导入文件:
// copy file content into a string var
$json_file = file_get_contents('data/questions2.json');
// convert the string to a json object
$jfo = json_decode($json_file);
// read the title value
//$servers = $jfo->servers->title;
// copy the posts array to a php var
$questions = $jfo->servers->questions;
第3步。这是我输出表单字段的PHP(就像这样做,以便为每个问题获取一个数组)。
<?php
foreach ($questions as $question)
{
$id++;
echo '<tr>';
echo ' <td>';
echo ' <label for="server'.$id.'">Server</label><br>';
echo ' <input name="question'.$id.'[]" type="hidden" id="serverlabel'.$id.'" value="server"/>';
echo ' <input name="question'.$id.'[]" id="server'.$id.'" value="'.$question->server.'"/>';
echo ' </td>';
echo ' <td>';
echo ' <label for="question'.$id.'">Question '.$id.'</label><br>';
echo ' <input name="question'.$id.'[]" type="hidden" id="questionlabel'.$id.'" value="question"/>';
echo ' <input name="question'.$id.'[]" id="question'.$id.'" size="70" value="'.$question->question.'"/>';
echo ' </td>';
echo ' <td>';
echo ' <label for="helptext'.$id.'">Helptext '.$id.'</label><br>';
echo ' <input name="question'.$id.'[]" type="hidden" id="helptextlabel'.$id.'" value="helptext"/>';
echo ' <input name="question'.$id.'[]" id="helptext'.$id.'" size="70" value="'. $question->helptext . '"/>';
echo ' </td>';
echo ' <td>';
echo ' <label for="answers'.$id.'">Answers to Question '.$id.'</label><br>';
echo ' <input name="question'.$id.'[]" type="hidden" id="answerslabel'.$id.'" value="answers"/>';
echo ' <input class="help" name="question'.$id.'[]" id="answers'.$id.'" value="'.$question->answers.'">';
echo ' <td>';
echo ' <div class="helptext leftpoint">Comma separated list</div>';
echo ' </td>';
echo '</tr>';
}
?>
第4步。然后我使用jQuery&amp; Ajax将表单数据发布到其他PHP文件。
我成功将表单数据转换为Json字符串,如下所示:
{
"question1": [
"server",
"server1",
"question",
"Is the server running?",
"helptext",
"It should be",
"answers",
"Yes, No"
],
"question2": [
"server",
"server2",
"question",
"Is the server running?",
"helptext",
"It should be",
"answers",
"Yes, No"
]
}
第5步。现在我想让上面的json重新变成我原来的json格式,所以我可以把它写回文件,所以我做了这个preg_replace(),但$ newJson是空。
//replace numbered questions with single "question" label
// make hidden form data back into json labels
$patterns = array();
$patterns[0] = '/(question\d)/g';
$patterns[1] = '/"server",/';
$patterns[2] = '/"question",/';
$patterns[3] = '/"helptext",/';
$patterns[4] = '/"answers",/';
$replacements = array();
$replacements[0] = 'question';
$replacements[1] = '"server":';
$replacements[2] = '"question":';
$replacements[3] = '"helptext":';
$replacements[4] = '"answers":';
$newJson = preg_replace($patterns, $replacements, $json);
我用过这个文档 http://php.net/manual/en/function.preg-replace.php和精彩的正则表达式验证工具https://regex101.com/
在第5步中我做错了什么?
(对不起,如果我的问题太长,但希望它会让你知道我想要做什么以及为什么,而且,因为我的解决方案是从各种其他StackOverflow页面拼凑而成的,它可能对某人有所帮助)
答案 0 :(得分:1)
更改此行:
$patterns[0] = '/(question\d)/g';
到
$patterns[0] = '/(question\d)/';
修正了您的问题。除了PHP中不存在的 g PCRE修饰符之外,在这种情况下它没有意义。 The documentation说(强调我的),
每个 模式将被替换版本替换
因此,preg_replace在用问题替换 question1 后,不会停止替换。相反,它继续用问题替换 / question \ d / 的所有实例,这是 g 修饰符在Perl中的作用(但不是PHP) )无论如何。
您可以在PHP沙箱here上看到结果。