所以我希望我的react 代码能够检测到我输入的每个链接,例如"http://localhost:3000/" 它为我提供了一个格式化的链接,而不是纯文本

以下是我的代码:

//Linkify.jsx
import DOMPurify from 'dompurify'
const Linkify = ({ children }) => {
  const isUrl = (word) => {
    const urlPattern = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/gm;
    return word.match(urlPattern);
  };

  const addMarkup = (word) => {
    return isUrl(word) ? `<a class="text-blue-500 hover:text-blue-600 transition" href="${word}">${word}</a>` : `<span className="no-underline">${word}</span>`;
  };

  const words = children.split(" ");
  const formatedWords = words.map((w, i) => addMarkup(w));

  const html = DOMPurify.sanitize(formatedWords.join(' '))

  return <span  dangerouslySetInnerHTML={{ __html: html }} />;
};

export default Linkify;

import Linkify from "./Linkify"

const Test = () => {
  return (
    <div>
      <Linkify>
      http://localhost:3000/
      </Linkify>
    </div>
  )
}

export default Test
//this code gives me not a link but a plain text

任何有用的东西

推荐答案

我用CODEPN复制了您的代码,它工作得很好,只有URL上的端口,并且没有RegEx没有拾取的顶级域(TLD).

将代码与常规格式的URL配合使用效果很好.

Working Codepen Example

import dompurify from "https://esm.sh/dompurify";
import React from "https://esm.sh/react";
import ReactDOM from "https://esm.sh/react-dom";

const Linkify = ({ children }) => {
  const isUrl = (word) => {
    const urlPattern = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/gm;
    return word.match(urlPattern);
  };

  const addMarkup = (word) => {
    return isUrl(word)
      ? `<a class="text-blue-500 hover:text-blue-600 transition" href="${word}">${word}</a>`
      : `<span className="no-underline">${word}</span>`;
  };

  const words = children.split(" ");
  const formatedWords = words.map((w, i) => addMarkup(w));

  const html = dompurify.sanitize(formatedWords.join(" "));

  return <span dangerouslySetInnerHTML={{ __html: html }} />;
};

const Test = () => {
  return (
    <div>
      <Linkify>
        Add a URL in here, for example, http://www.google.com/ -- look's good!
      </Linkify>
    </div>
  );
};

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<Test />);

干杯

Reactjs相关问答推荐

如何通过TEK查询将对象传递到Express后台

Firebase删除UserWithEmail AndPassword仅创建匿名用户

将对象添加到集合中的数组时的no_id字段

TypeError:b不是React.js中的函数错误

如何在MUI X数据网格列中显示IMG?

生成Reaction Vite应用程序的停靠容器时无法识别环境变量

自定义变量默认、聚焦和填充时所需TextField中标签的星号 colored颜色

为什么React UseEffect挂钩在页面重新加载时运行

我在Route组件上使用元素属性,这样就不需要ID了吗?

状态改变不会触发重新渲染

单击按钮不会切换组件(当按钮和组件位于两个单独的文件中时)

我发送的 prop 的值不会改变.如果成功登录,导航栏中的 prop 必须为 true.我从后端得到 200 ok

使用 MuiCssBaseline 在所有 MUI v5 标签上设置边距 0

如何在 ReactJS 中提交后删除 URL 中的查询参数

React Three Fiber mesh 标签在此浏览器中无法识别

使用 Jest/React 测试库时,如何测试由 setInterval 函数创建的 DOM 更改?

父状态改变后子组件丢失状态

如何解决在 react.js 中找不到模块错误

在react 路由dom版本6中的组件内添加路由

bootstrap 导航栏切换器在 reactjs 中不起作用