React 30 秒速學:製做自動識別連接的文本組件

本文譯自:30-seconds-of-react。React 30 秒速學:全篇中文翻譯、學習,地址:30-seconds-of-react-zh_CN-umi,全部案例進行分析、註釋、上線。react

系列文章:git

AutoLink自動識別文本中的連接

將字符串中的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" />; } 複製代碼
相關文章
相關標籤/搜索