TypeError:无法在反应中读取null的属性“ 0”

时间:2020-05-05 06:39:00

标签: javascript reactjs typescript

我有一个打字稿应用程序,需要我提供帮助。网站所有者希望在最后一刻更改前端,以便可以单击链接。唯一的问题是,它们将数据作为常规的锚href标签输入到后端。所以我一直在努力工作,因为出于安全原因我不能使用该innerhtml方法。

  switch (note.kind) {
    case "text":
      return (
        <div>
          {" "}
          {note.text.map((content: string, idx: number) => {
            const result = [];
            const matches = content.match(
              /(.*?)(<a href=")?(https?|www)((".*?>.*?<\/a>)|[^\s>]?)*(.*?)/gi
            );

            if (!!matches) {
              matches.forEach((match) => {
                let link;
                if (/href="/i.test(match)) {
                  const url = match
                    .match(/<a href="(.*?)(?=">)/i)![0]
                    .replace('<a href="', "");
                  const linkText = match
                    .match(/(?:<a href=".*?">)(.*)(?=<\/a>)/)![0]
                    .replace(/(?:<a href=".*?">)/i, "");
                  link = <a href={url}>{linkText}</a>;
                } else {
                  const url = match.match(/(https?|www)[^\s]*/gi)!.join("");
                  link = <a href={url}>{url}</a>;
                }

                const splitter = match.match(
                  /(<a href=")?(https?|www)[^\s]*(.*<\/a>)?/gi
                )![0];
                const paredPlainText = match.split(new RegExp(splitter));
                result.push(paredPlainText[0]);
                result.push(link);
                result.push(paredPlainText[1]);
              });
            } else {
              result.push(content);
            }
            console.log(result);

            return <p>{result}</p>;
          })}
        </div>
      );

这是我的代码,但是唯一的问题是我遇到TypeError:无法读取.match方法上null的属性“ 0”。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

您应该确保正则表达式匹配并且不为空

const splitter = match.match(/(<a href=")?(https?|www)[^\s]*(.*<\/a>)?/gi);

if (splitter && splitter.length) {
    const paredPlainText = match.split(new RegExp(splitter[0]));
    const [firstParedPlainText, secondParsedPlainText] = paredPlainText || [null, null];
    if (firstParedPlainText) result.push(firstParedPlainText);

    result.push(link);
    if (secondParsedPlainText) result.push(secondParsedPlainText);
}