使用PHP preg_replace()和Json数据

时间:2016-01-20 17:06:29

标签: php jquery json ajax regex

我正在尝试使用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页面拼凑而成的,它可能对某人有所帮助)

1 个答案:

答案 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上看到结果。