亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在javascript中將純文本轉換為超鏈接

在javascript中將純文本轉換為超鏈接

千萬里不及你 2021-11-25 19:15:29
我有一個用例,我需要識別字符串中的電話號碼并將它們轉換為可點擊的鏈接。目前使用外部庫超出了范圍。這是我到目前為止所做的:字符串:“這是我的電話號碼 - 1234567890” 我可以使用正則表達式提取 1234567890 作為電話號碼。我現在想在原始字符串中替換它,所以這就是我所做的:const string = "This is my phone number - 1234567890"const number = "1234567890"const newString = '<a href="#">' + number + '</a>'number = number.replace(number, newString);當我這樣做時,我的輸出不是將電話號碼作為超鏈接,而是這樣的:This is my phone number - <a href="#">1234567890</a>如果我創建沒有引號的 newString,就像這樣const newString = <a href="#">number</a>我的輸出是這樣的:This is my phone number - [object Object]我如何使它成為可點擊的鏈接?
查看完整描述

3 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

您需要將電話號碼替換為鏈接,然后用于dangerouslySetInnerHTML添加到 React 組件。


注意:dangerouslySetInnerHTML之所以調用它,是因為您容易受到來自用戶生成內容的 XSS 攻擊。您應該先對琴弦進行消毒。


const Linkify = ({ text, pattern, formatter }) => {

  const __html = text.replace(pattern, formatter);


  return <div dangerouslySetInnerHTML={{ __html }} />;

};


const text = 'This is my phone number - 1234567890';

const pattern = /\d+/g;

const formatter = str => `<a href="#${str}">${str}</a>`;


ReactDOM.render(

  <Linkify text={text} pattern={pattern} formatter={formatter} />,

  root

);

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>


<div id="root"></div>


不使用dangerouslySetInnerHTML主要問題是將字符串分解為鏈接/非鏈接字符串。這可以通過使用此答案中的代碼來完成。我更新了代碼以將字符串標記為匹配項,因此您可以相應地設置它們的格式。


const Linkify = ({ text, pattern, formatter }) => {

  const arr = getSegments(pattern, text);


  return arr.map(formatter);

};


const text = 'This is my phone number - 1234567890, and his is 34234123142';

const pattern = /\d+/g;

const formatter = ({ text, match }) => match ? <a href={`#${text}`}>{text}</a> : text;


ReactDOM.render(

  <Linkify text={text} pattern={pattern} formatter={formatter} />,

  root

);


function getSegments(rex, str) {

  const segments = [];

  let lastIndex = 0;

  let match;

  rex.lastIndex = 0; // In case there's a dangling previous search

  while (match = rex.exec(str)) {

    if (match.index > lastIndex) {

      segments.push({ text: str.substring(lastIndex, match.index) });

    }

    segments.push({ text: match[0], match: true });

    lastIndex = match.index + match[0].length;

  }

  if (lastIndex < str.length) {

    segments.push({ text: str.substring(lastIndex) });

  }

  return segments;

}

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>


<div id="root"></div>


查看完整回答
反對 回復 2021-11-25
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

您真的不想將“字符串”設置為const newString,我會稱其為元素。你可以這樣做:


const phoneEl = (

  <a href="#">

    {number}

  </a>

);

哪里number是存儲在一個名為變量的電話號碼number。


然后你會寫:


<p>My phone number is - {phoneEl}</p>

我也建議


<href={`tel:${number}`}>

如果您希望人們能夠單擊鏈接并撥號。


查看完整回答
反對 回復 2021-11-25
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

const string = document.querySelector("body");

const text = string.innerText;


const textArr = text.split(" ").map(item => {

  if(item.match(/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im)){

    item = `<a href="tel:${item}">${item}</a>`;

  }

  return item;

});


const newText = textArr.join(" ");


console.log({ newText })


string.innerHtml = newText;

<p class="body">

  This is my phone number - 555-555-5555

</p>


查看完整回答
反對 回復 2021-11-25
  • 3 回答
  • 0 關注
  • 1000 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號