数组上的正则表达式

Regular Expressions on array

本文关键字:正则表达式 数组      更新时间:2023-09-26

我正在尝试编辑数组中的第一个条目,然后再将其放入另一个文件。

就是这样:

(["'"NAMES'":'"cs.js'"},[

我想把它变成这样:

([{"NAMES":"cs.js"},[

正在使用在线正则表达式生成器,但到目前为止,我只设法使用/编辑到这一点。["['']/并替换为 ([{:

([{"NAMES'":'"cs.js'"},[

任何帮助将不胜感激。

编辑:

以下是一些代码:

var initialCourseArray = new Array() 
initialCourseArray.push(["'"NAMES'":'"cs.js'"},[
{"COURSE_ID":"ENGL 1013"},
{"COURSE_ID":"FAH1"},
{"COURSE_ID":"USHG1"},
{"COURSE_ID":"TECH 1001"},
{"COURSE_ID":"COMS 1403"},
{"COURSE_ID":"COMS 1411"},
{"COURSE_ID":"ENGL 1023"},
{"COURSE_ID":"SS1"},
{"COURSE_ID":"MATH 2914"},

后面的东西是数组中的其余值,它们看起来不像这个,所以我不担心它们。

第二次编辑:

由于老实说,我应该首先放置在这里的代码存在一些混乱,因此我使用php文件从测试数据库中检索课程数据,然后将其编码为JSON,对其进行格式化,然后使用fopen和fprintf将其放置在javascript文件中。我给你的部分是最终在javascript文件中的内容。

第三次编辑:

这是我用来格式化数组的代码。这非常混乱,因为我的领导不断改变他希望结果的格式:

$row1 = "'"NAMES'"";
$colon = ":";
$row2 = "'"".$major.".js'"";
$major_name = $row1.$colon.$row2;
//The course data is already loaded into the table. This why I am using array_unshift to place the major_name inside.
array_unshift($major_array, $major_name);
array_push($major_array, "false");
$json_string = json_encode($major_array);
$re = "/.,/";
$subst = "},'r'n";
$json_string = preg_replace($re, $subst, $json_string);
$re2 = "/',(?=[^.]*$)/";
$subst2 = ",[";
$json_string = preg_replace($re2, $subst2, $json_string, 1);
$first_string = "var initialCourseArray = new Array()";
$second_string = "initialCourseArray.push(";
$end_bracket = "]";
$end_parentheses =")";

有几个问题:

1. 不要操作 JSON 字符串

您永远不应该操作作为json_encode结果的字符串,因为您很可能会使 JSON 文本无效,这实际上发生在您的情况下。

所以使用这种语句:

$json_string = preg_replace($re, $subst, $json_string);

是在自找麻烦。一旦你有了$json_string,它应该是最终的。你想在结构上发生的任何事情都必须在你打电话之前发生json_encode

即使您只想在 JSON 字符串中添加换行符,也不要这样做。 json_code提供了一个"漂亮的打印"选项,可以为您完成:

json_encode(...., JSON_PRETTY_PRINT);

2. JavaScript 没有关联数组

第二个问题是,在 JavaScript 中,你不能有类似的东西

["NAMES":"cs.js" ...]

所以json_encode永远不会产生这样的东西。如果你想要JavaScript中的命名键(如"NAMES"),你不能将其定义为数组,而应将其定义为对象:

{"NAMES":"cs.js" ...} 

如果您为它提供相应的 PHP 结构(即关联数组)并让它在不篡改的情况下完成其工作,json_encode 将为您执行此操作。

3. 不要添加"false"

"false"作为元素添加到课程数组中似乎没有用。在 JavaScript 中,您可以轻松检查数组中有多少元素,因此无需在末尾放置一种停止符号。

无论如何,如果在 JavaScript 中引用不存在的数组中的元素,则会得到 undefined ,您可以验证它,就像验证值"false"一样。

我强烈建议不要这样做。

建议的代码

您在问题中提供的 PHP 代码可以替换为以下内容:

// Add the names element as a separate item next to the courses array,
// which we put in the "courses" property.
$major_array = array(
    "names" => $major,
    "courses" => $major_array
);
// Turn into JSON text with added line breaks and indentation:
$json_string = json_encode($major_array, JSON_PRETTY_PRINT);
// Don't touch the JSON text anymore, but output it:
echo "var initialCourse = $json_string;";

输出(JavaScript)将是这样的:

var initialCourse = {
    "names": "cs",
    "courses": [
        {
            "COURSE_ID": "ENGL 1013"
        },
        {
            "COURSE_ID": "FAH1"
        },
        {
            "COURSE_ID": "USHG1"
        },
        {
            "COURSE_ID": "TECH 1001"
        },
        {
            "COURSE_ID": "COMS 1403"
        },
        {
            "COURSE_ID": "COMS 1411"
        },
        {
            "COURSE_ID": "ENGL 1023"
        },
        {
            "COURSE_ID": "SS1"
        },
        {
            "COURSE_ID": "MATH 2914"
        }
    ]
};

正如我上面提到的,这是一个对象结构,而不是数组结构,因为 JavaScript 不允许数组表示法中的命名键。如果在 JavaScript 中你需要迭代上述结构中的课程,你可以解决 courses 属性(它是一个数组),如下所示:

for (var course of initialCourse.courses) {
    console.log('course id: ' + course.COURSE_ID);
}

结构更简洁

我必须说,只有一个属性的对象有点矫枉过正。这种结构将更加简洁和高效:

var initialCourse = {
    "names": "cs",
    "courses": [
        "ENGL 1013",
        "FAH1",
        "USHG1",
        "TECH 1001",
        "COMS 1403",
        "COMS 1411",
        "ENGL 1023",
        "SS1",
        "MATH 2914"
    ]
};

在 JavaScript 中,你可以像这样迭代这些课程:

for (var course of initialCourse.courses) {
    console.log('course id: ' + course);
}

如果您对此感兴趣,您应该在我上面建议的任何 PHP 代码之前将这一行添加到您的 PHP 代码中:

$major_array = array_map(function ($course) { return $course["COURSE_ID"]; }, $major_array);

如果您只想将其应用于该行,

找到/"?''"/替换"就可以了。