将字符串替换为JSX标签

时间:2019-03-27 20:47:24

标签: javascript reactjs jsx

我有一个像这样的字符串

let str = "You would get items\nwhich value about **$50**\nif you **pre-booked** it!"

我想将\n替换为<br/>,并用下面的代码实现了它。

str.split('\n').map((line)=>(<span>{line}<br/></span>)

我取得的成就

<span>You would get items<br/></span>
<span>which value about $50<br/></span>
<span>if you pre-booked it!</span>

现在,我想强调一些这样的词。

我期望的结果

<span>You would get items<br/></span>
<span>which value about <b>$50</b><span>
<span>if you <b>pre-booked</b> it!</span>

我想像下面这样使用。

const TextFormat = ({text}) => (
  <React.Fragment>
    {
      text.split('\n').map((line, i) => (<span key={i}>{line}<br/></span>)
    }
  </React.Fragment>
)

2 个答案:

答案 0 :(得分:3)

在您的第一个map中,您可以按这些特定的关键字分隔行。当您在split的正则表达式中包含捕获组时,捕获的子字符串将包含在结果数组中,因此您可以执行以下操作:

<React.Fragment>
  {
    str.split('\n').map(line => (
      <span>
        {line.split(/\*\*(.+?)\*\*/).map((s, i) => i % 2 ? (<b>{s}</b>) : s)}
        <br/>
      </span>
    ))
  }
</React.Fragment>

这看起来像降价促销。您还应该考虑使用react-markdown之类的markdown插件来简化您的生活。

答案 1 :(得分:2)

let str = "You would get items\nwhich value about **$50**\nif you **pre-booked** it!"

const res = str.split('\n').map(line =>

  `<span>  ${line.replace(/\*\*(.*?).\*\*/,match => `<b>${match.substring(2, match.length - 2 )}</b>`)} <br/> </span>`
)

console.log(res)