js Regex没有按预期工作。换行未被检测到

时间:2018-04-27 02:21:50

标签: javascript node.js regex xml

我有一个字符串如下:

<abc name = "foo">
  <child>bar</child>
</abc>
<xyz>1</xyz>

<abc name = "foo2">
  <child>bar2</child>
</abc>
<xyz>5</xyz>

我创建了一个正则表达式如下:

var regexapi = /<abc\s*name\s*=\s*"(.*?)"[\s\S]*?<\/abc>\n*<xyz>/gim;
while ( (resApi = regexapi.exec(data))) {
    array1.push(resApi[0]);
}
console.log(array1[0]);

现在,如果我标签<xyz>1</xyz>打印array1[0]应显示undefined,但打印方式如下:

    <abc name = "foo">
  <child>bar</child>
</abc>

<abc name = "foo2">
  <child>bar2</child>
</abc>
<xyz>

我认为\n*存在一些问题,因为我提供了多行标记。虽然不确定。 请注意,这没有<xyz>1</xyz>标记。我希望它打印undefined。 感谢。

2 个答案:

答案 0 :(得分:0)

最好在这里使用XML解析器。如果你坚持使用正则表达式,这里有一个选项:

var input = "<abc name = \"foo\">\n\t<child>bar</child>\n</abc>\n<xyz>\n\n<abc name = \"foo2\">\t\n<child>bar2</child>\n</abc>\n<xyz>35</xyz>";
var regex = /<abc[^>]*>(?:(?!<\/abc>)[\s\S]*)<\/abc>\s*<xyz>((?!<xyz>)[\s\S]*)<\/xyz>/g;
var match = regex.exec(input);
console.log(match[1]); // 35

这匹配<abc>标记后跟可选空格,然后紧跟<xyz>标记。如果该标记为空,则在第一个捕获组match[1]中不会捕获任何内容。

答案 1 :(得分:0)

正则表达式:

$name = $_POST["Name"];
$grade = $_POST["Grade"];
$handle = fopen("users.csv", "a+t");

if (!$handle) die("error, can't open file!");
if (!flock($handle, LOCK_EX)) die("lock error!");

$records = array();
while (!feof($handle))
    $records[] = fgetcsv($handle);

// 1. Use this to find the number of elements
$count = count($records);

// 2. Use this to find the largest current ID
$max = $count > 0 ? max(array_column($records, 0)) : 0;

// Our new ID should be based on (1) or (2) above
$newId = $max + 1;

fputcsv($handle, array($newId, $name, $grade));

fseek($handle, 0);
while (!feof($handle)) { 
    $record = fgetcsv($handle);
    // ... print out your <div> here ...
}

Regex Demo

js Demo

匹配<\/abc>\n(?:<xyz>(.*)(?=<\/xyz))* 后跟</abc>和值。如果缺少<xyz>标记<xyz>将返回空字符串(未定义)