javascript - 在javascript中将纯文本转换为超链接

标签 javascript html reactjs

我有一个用例,我需要识别字符串中的电话号码并将其转换为可点击的链接。使用外部库目前超出了范围。

这是我到目前为止所做的事情:

字符串:“这是我的电话号码 - 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]

如何使其成为可点击的链接?

最佳答案

您需要替换为用链接包装电话号码,然后使用 dangerouslySetInnerHTML 添加到 React 组件。

注意:它被称为dangerouslySetInnerHTML,因为您容易受到来自用户生成内容的 XSS 攻击。您应该首先 sanitise 字符串。

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,主要问题是将字符串分解为链接/非链接字符串。这可以通过使用 answer 中的代码来完成。我已更新代码以将字符串标记为匹配项,以便您可以相应地设置它们的格式。

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>

关于javascript - 在javascript中将纯文本转换为超链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58457493/

相关文章:

javascript - react : onChange not updating value to input field

javascript - 哪些元素有自己的按键处理?

javascript - 在 React 组件中为 this.props.children 添加自定义 Prop

html - CSS:将所有内容包装在一个带有滚动条的框中

html - 浏览器对 HTML 元素的默认 CSS

javascript - 如何访问index.js文件中的react redux状态?

javascript - 如何通过由javascript提交的phpcurl登录,即表单中没有提交按钮

javascript - 我怎样才能从php中获取数据到js

html - 直到 div 末尾的底部边框线,即使文本没有继续

javascript - 清除();方法不适用于 React 输入