REACT - 如何将 URL 字符串替换为 <a> 元素并正确渲染

REACT - How to replace URL strings to <a> elements and rendering it properly

给定以下内容:

Hi Christine,

Are you receiving?
--
Daniel Vieira Costa.
Frontend Developer | Zeuss, Inc.
Know It's Possible.
http://www.zeuss.com

我想将所有 URL(例如 http://www.zeuss.com)替换为 <a> elements/objects 并在 React 内容中呈现它。

我的基本代码如下:

// regular expression used to find out all URL occorrences
let regexpression = /(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/ig;

// replace all URL occurrences to <a> elements
content = content.replace(regexpression, newLink => {
    return <a>{newLink}</a>
})

但是,它呈现以下结果:

Hi Christine, 

Are you receiving?
--
Daniel Vieira Costa.
Frontend Developer | Zeuss, Inc.
Know It's Possible.
[object Object]

其中 [object Object] 应该是 <a> 元素。

我想避免使用 React 的原始 HTML(设置 dangerouslySetInnerHtml 属性)。有没有更好的实现方式?

你用那个语法创建的是一个反应元素,而 oyu 想要的是一个字符串,所以试试:

return '<a>' + newLink + '</a>'

无论如何您都必须使用 dangerouslySetInnerHtml,因为在替换操作后您将得到一个包含 HMTL 的字符串。

在回复评论时添加:

您实际上可以通过首先在 URL 处拆分字符串,然后将其放回到 JSX 表达式中来完成此操作。

假设您设法将字符串拆分成这样的数组(应该可行,但我将那部分留给您):

let splitString = ['Hi Christine,

Are you receiving?
--
Daniel Vieira Costa.
Frontend Developer | Zeuss, Inc.
Know It's Possible.', 'http://www.zeuss.com']

let parsedResult = splitString.map((part) => {
    if (part.matches(regexpression)) {
       return <a>{part}</a>
    }
    return part
})

return <div>{parsedResult}</div>

这应该可以在不使用 dangerouslySetInnerHtml 的情况下工作。