我有一个字符串如下:
<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。
感谢。
答案 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 ...
}
匹配<\/abc>\n(?:<xyz>(.*)(?=<\/xyz))*
后跟</abc>
和值。如果缺少<xyz>
标记<xyz>
将返回空字符串(未定义)