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

IT技术 reactjs replace anchor
2021-05-13 03:30:58

鉴于以下内容:

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>元素/对象并在 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(设置dangerouslySetInnerHtml属性)的原始 HTML 有没有更好的实现?

1个回答

您使用该语法创建的是一个 react 元素,但 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>

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