自动文本链接
将字符串渲染为纯文本,并将其中的URL转换为适当的链接元素。
- 使用
String.prototype.split()
和String.prototype.match()
与正则表达式在字符串中查找URL。 - 将匹配的URL渲染为
<a>
元素,并处理缺少协议前缀的情况。 - 将字符串的其余部分渲染为纯文本。
const AutoLink = ({ text }) => {
const delimiter = /((?:https?:\/\/)?(?:(?:[a-z0-9]?(?:[a-z0-9\-]{1,61}[a-z0-9])?\.[^\.|\s])+[a-z\.]*[a-z]+|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})(?::\d{1,5})*[a-z0-9.,_\/~#&=;%+?\-\\(\\)]*)/gi;
return (
<>
{text.split(delimiter).map(word => {
const match = word.match(delimiter);
if (match) {
const url = match[0];
return (
<a href={url.startsWith('http') ? url : `http://${url}`}>{url}</a>
);
}
return word;
})}
</>
);
};
ReactDOM.createRoot(document.getElementById('root')).render(
<AutoLink text="foo bar baz http://example.org bar" />
);