本文译自:30-seconds-of-react。React 30 秒速学:全篇中文翻译、学习,地址:30-seconds-of-react-zh_CN-umi,全部案例进行分析、注释、上线。react
系列文章:git
将字符串中的URL转换为适当的 <a>
元素。github
String.prototype.split()
和 String.prototype.match()
来查找字符串中的URL。<React.Fragment>
不产生多余的元素;其匹配的URL呈现为<a>
元素,必要时须要处理丢失的协议前缀补充为http://
,并将其他字符串呈现为明文。import React from "react";
function AutoLink({ text }) {
// 用于找 url 的正则表达式
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 => { // foo bar baz // http://example.org // bar console.log(word); // 从以上分割的内容中找到具体的url的部分 // 进行超连接的处理 let match = word.match(delimiter); if (match) { let url = match[0]; return ( <a href={url.startsWith("http") ? url : `http://${url}`} key={url} target="_blank">{url}</a> ); } return word; })} </React.Fragment> ); } 复制代码
export default function() {
return <AutoLink text="foo bar baz http://example.org barhttp://baidu.com 123" />; } 复制代码