阵列上的正则表达式

时间:2016-04-26 20:18:26

标签: javascript regex

我试图在放入另一个文件之前编辑数组中的第一个条目。

就是这样:

(["\"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 =")";

2 个答案:

答案 0 :(得分:1)

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

找到 void替换 /"?\\"/即可。

答案 1 :(得分:1)

有几个问题:

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" ...} 

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

3。不要添加"false"

"false"作为元素添加到courses数组似乎没什么用。在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);