我有一个打字稿应用程序,需要我提供帮助。网站所有者希望在最后一刻更改前端,以便可以单击链接。唯一的问题是,它们将数据作为常规的锚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”。任何帮助将不胜感激,谢谢!
答案 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);
}