首页 > 试题广场 >

实现一个HTML语法检查器

[编程题]实现一个HTML语法检查器
  • 热度指数:1566 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
实现一个HTML语法检查器。HTML语法规则简化如下:标签必须闭合,可以由开始和结束两个标签闭合,如<div></div>,也可以自闭合,
如<div />
标签可以嵌套如<div><a></a></div>或者 <div><a/></div>,但是标签不能交叉:<div><a></div></a>是不允许的标签里可以有属性
如<div id="a<1"></div>
属性的规则是name="任意非引号字符",多属性声明之间必须有空格,属性声明不符合规则时,整段HTML都算语法错误
输入文本只会出现字母a-z和<>"=
请用任意语言实现一个HTML语法检查器函数,有语法错误返回1,没有语法错误返回0

输入描述:
一行,一个HTML字符串


输出描述:
有语法错误返回1,没有语法错误返回0
示例1

输入

<div><a></a></div>

输出

0
示例2

输入

<div><a></div></a>

输出

1

备注:
字符串长度不超过100
JavaScript实现,说好的任意非引号字符呢?太坑了!用例用dev tools的network看就有了。
var readline = require("readline");
const r1 = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
r1.on("line", function (code) {
  if (!code) {
    console.log(0);
    return 0;
  }
  const autoClose = /<([a-z]+)(\s+[a-z"]+(="[a-z<>/ "]*")*)*(\s*\/)>/;
  const leftRegex = /<([a-z]+)(\s+[a-z"]+(="[a-z<>/ "]*")*)*\s*>/;
  const rightRegex = /<\/\s*[a-z]+\s*>/;
  const allRegex = /<\/*\s*([a-z]+)(\s+[a-z"]+(="[a-z<>/ "]*")*)*\s*\/*>/gm;
  const arr = code.match(allRegex).filter(Boolean);
  // 未匹配到的部分如果有<> 认为不正确
  const rest = arr.reduce((acc, cur) => acc.replace(cur, ""), code);
  if (rest.match(/<|>/)) {
    console.log(1);
    return 1;
  }

  const left2right = (left) => left.replace(leftRegex, `</$1>`);
  const formatRight = (right) => right.replace(" ", "");
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (leftRegex.test(arr[i]) && arr[i].replace(leftRegex, "") === "") {
      result.push(arr[i]);
      continue;
    }
    if (autoClose.test(arr[i]) && arr[i].replace(autoClose, "") === "") {
      continue;
    }
    if (rightRegex.test(arr[i]) && arr[i].replace(rightRegex, "") === "") {
      const lastLeft = result.pop();
      if (left2right(lastLeft) !== formatRight(arr[i])) {
        console.log(1);
        return 1;
      }
    } else {
      console.log(0);
      return 0;
    }
  }
  if (result.length > 0) {
    console.log(1);
    return 1;
  }
  console.log(0);
  return 0;
});


发表于 2020-07-25 23:11:21 回复(0)

热门推荐

通过挑战的用户

查看代码