首页 > 编程问答 >Javascript:如何替换 urls 和 youtube urls,并将 urls 替换为锚标签,将 youtube urls 替换为 Iframe 标签

Javascript:如何替换 urls 和 youtube urls,并将 urls 替换为锚标签,将 youtube urls 替换为 Iframe 标签

时间:2024-05-30 09:22:48浏览次数:19  
标签:javascript react-native

如果字符串返回:

str = ``
        https://www.google.com
        http://google.com
        https://www.youtube.com/live/gNIQWYgf-0
        https://www.youtube.com/embed/3ul2LYG6j14?si=fgxYHjyt6zBmoYEr
        https://youtu.be/75Dhfjf6hfjfj
        这还必须考虑到不同 Youtube 网址的差异

  `

因此,当该字符串返回时,我希望为以下内容包装锚标记:

<a href="https://www.google.com">https://www.google.com</a>;
<a href="https://google.com">https://www.google.com</a>;

并使用 iframe 标记包装 YouTube:

<iframe width="420" height="315" src="https://youtu.be/75Dhfjf6hfjfj"></iframe>;
<iframe width="420" height="315" src="https://www.youtube.com/embed/3ul2LYG6j14?si=fgxYHjyt6zBmoYEr"></iframe>;

我使用 react-native 中的 react-native-pell-rich-editor 提出了这个问题,因为我尝试了这种方法,但没有成功,所以我尝试使用 webview。这个问题是在这里提出的 如何替换 urls 和 youtube urls 并将 urls 替换为锚标签,以及将 youtube urls 替换为 Iframe 标签

以下是我的代码:

<WebView source={{
            html:`

                    
                    <!DOCTYPE html>;
                    html>;
                        <head>;
                            <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==";crossorigin="anonymous" referrerpolicy="no-referrer"></script>;
                            
                        </head>;
                        <body>;
                        <style>;
                                [contentEdditable=true]:empty:not(:focus):before {
                                    content: attr(data-text);
                                    cursor: text;
                                    color: red;
                                    pointer-events:none;
                                }

                                #placeholder{
                                    位置:绝对;
                                    
                                    color:#BDBDBD;font-size:46px;outline:none;
                                }
                                #contentHtml{
                                    位置:绝对
                                    color:black;font-size:46px;outline:none;width:100%;
                                }
                            </style>;
                            <div id="contentHtml" contenteditable=true>;
                            </div>;
                            <div id="placeholder">;
                                输入评论...
                            </div>;
                        </body>;
                    </html>;
                    <script>;
                        $("#placeholder").on("click", function(){
                            //alert("ddd");
                            $("#contentHtml").focus();
                            $(this).hide();
                        })

                        $("#contentHtml").on("keyup", function(){)
                            //alert("ddd");
                            if($("#contentHtml").html().length == 0){
                                $("#placeholder").show();
                            }else{
                                $("#placeholder").hide();
                            }
                        })
                    </script>;
                    
                    `,
        }}
        style={{
            width: '100%'、
            height: '100%'、
            fontSize:46、
        }}>;



    

我已设法使用 2 个 div 获得了占位符,并可通过 jQuery 事件正常工作,但现在我的任务是获取 #contentHtml 中的字符串,并将标准 URL 转换为锚标记,将 YouTube URL 转换为 iframe 标记。

如何在 javascript 中实现这一功能?


<script>
  $(document).ready(function() {
    function replaceContent() {
      let contentHtml = $("#contentHtml");
      let content = contentHtml.html();

      // 使用正则表达式匹配 URL
      content = content.replace(/(https?:\/\/[^\s]+)/g, function(url) {
        let wrappedUrl = '';
        if (url.match(/youtu\.be|youtube\.com/)) {
          // 如果是 YouTube 链接,则将其包装在 iframe 中
          wrappedUrl = `<iframe width="420" height="315" src="${url.replace('watch?v=', 'embed/')}"></iframe>`;
        } else {
          // 否则,将其包装在锚标签中
          wrappedUrl = `<a href="${url}" target="_blank">${url}</a>`;
        }
        return wrappedUrl;
      });

      // 将更新后的内容设置回 div
      contentHtml.html(content);
    }

    // 在每次按键时调用 replaceContent 函数
    $("#contentHtml").on("keyup", replaceContent);
  });
</script>

这段代码做了以下几件事:

  1. 使用正则表达式匹配 URL: 代码使用 /(https?:\/\/[^\s]+)/g 这个正则表达式来匹配字符串中的所有 URL。
  2. 区分 YouTube 和普通 URL: 代码使用 .match(/youtu\.be|youtube\.com/) 来判断一个 URL 是否是 YouTube 链接。
  3. 包装 URL:
  4. 对于 YouTube 链接,代码将其包装在一个 <iframe> 标签中,并设置宽度和高度。同时,代码还会将 watch?v= 替换为 embed/,以确保视频能够正确嵌入。
  5. 对于其他 URL,代码将其包装在一个 <a> 标签中,并设置 target="_blank" 属性,以便在新标签页中打开链接。
  6. 更新内容: 最后,代码使用 .html(content) 将更新后的内容设置回 #contentHtml div。

通过在每次按键时调用 replaceContent 函数,这段代码可以实时地将用户输入的 URL 转换为链接或嵌入式视频。

标签:javascript,react-native
From: 78552486

相关文章

  • 前端学习笔记——JavaScript基础语言的学习(三)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1,类型转换:把一种数据类型的变量转换成......
  • 前端学习笔记——JavaScript基础语言的学习(二)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1.数组的基本使用2.常量的基本使用......
  • javascript引入了不同版本的多个jquery,如何不同版本之间不互相影响
    1️⃣ 原因  由于是一个比较老的项目,所以在做功能时,用到了老项目的一个控件,这一个控件是以前封装好的,依赖的是jquery-1.6.min.js。但是在做下拉框多选功能时,在网上找了一个下拉框多选的框架,但是这个框架依赖是jquery.js(3.7.1),所以才出现了这个问题。  简单来说就是新老控件......
  • javascript右键菜单
      文章来源:https://segmentfault.com/a/1190000023098787 HTML<h1>Clickonblanktoshowcustomcontextmenus</h1>CSS.custom-context-menu{position:fixed;border:1pxsolid#ccc;list-style:none;padding:4px0;border-radius:......
  • JavaScript基础ECMAScript知识点复习整理
    **本篇文章食用的简单说明**本篇文章为复习JavaScript基础ECMAScript进行了知识点梳理,加粗部分为重点!!!加粗加红为重重点!!!由于JavaScript内容比较多,本篇文章只是基础部分,WebAPIs(DOM和BOM)等知识在后续过程中会继续更新,欢迎小伙伴在评论区补充~推荐大家按记忆梳理部分的内容自......
  • JavaScript中的let关键字详解
    在JavaScript中,let关键字用于声明局部变量,它与传统的var关键字类似,但引入了几个关键的区别和改进,主要体现在作用域规则、重复声明限制以及引入了“暂时性死区”等概念。下面将详细介绍let的特点及其与var的不同之处。块级作用域vs函数作用域var声明的变量:其作用域是函数......
  • JavaScript日期与时间处理的艺术
    JavaScript日期与时间处理的艺术基础概念:JavaScript中的日期对象诞生时刻时间戳:纪元的秘密案例一:格式化日期的艺术美化你的日期自定义格式化案例二:跨时区的舞蹈时区转换案例三:时间旅行的挑战闰年与月份天数避免日期计算的陷阱实战技巧与避坑指南性能优化安全性考量问......
  • JavaScript 中的 Range 和 Selection 对象
    JavaScript中的Range和Selection对象前言最近在做鼠标框选的需求,鼠标框选就需要用到Range和Selection对象。Range表示选择的区间范围,Selection表示选择的文档内容。下面就详细说下这两个对象一、RangeRange接口表示一个包含节点与文本节点的一部分的文档片段。......
  • 前端历程(包括html,JavaScript,jQuery,bootstrap)
    前端学习历程jQuery"""jQuery内部封装了原生的js代码(还额外添加了很多功能)能够让你通过书写更少的代码完成js操作类似于python里面的模块在前端模块不叫模块叫"类库"兼容多个浏览器的你在使用jQuery的时候就不需要考虑浏览器兼容问题jQuery的宗旨 writelessdom......
  • 《你不知道的JavaScript》三卷读后感
    《你不知道的JavaScript》三卷读后感 本系列的作者是Kyle Simpson,上卷译者赵望野、梁杰,中卷译者单业,下卷译者单业、姜南。我个人觉得第一卷是本系列最好的(必读),而第二卷虽然也讲解了很多知识点,但是对于异步和性能的那部分提及了信任问题上,我不敢苟同,毕竟开源的大......