2019-09-25
描述
渲染一个字符串做为纯文本,并将其中的 URL 部分转换为一个 <a>
元素。
- 使用
String.prototype.split()
和带正则表达式的String.prototype.match()
来找出文本中的 URL - 返回一个
<React.Fragment>
,将匹配的 URL 渲染为一个<a>
元素,如果必要的话对缺失的协议前缀进行处理,剩余的字符串做为纯文本进行渲染
实现
function 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 (
<React.Fragment>
{text.split(delimiter).map(word => {
let match = word.match(delimiter);
if (match) {
let url = match[0];
return <a href={url.startsWith('http') ? url : `http://${url}`}>{url}</a>;
}
return word;
})}
</React.Fragment>
);
}
使用
ReactDOM.render(
<AutoLink text="foo bar baz http://example.org bar" />,
document.getElementById('root')
);