js里如何正确理解正则表达式的回溯

php中世界最好的语言
发布: 2018-03-30 13:56:48
原创
1384 人浏览过

这次给大家带来js里如何正确理解正则表达式的回溯,js里正确使用正则表达式回溯的注意事项有哪些,下面就是实战案例,一起来看一下。

在正则表达式实现中,回溯是匹配过程的基本组成部分,它是正则表达式如此好用和强大的根源。然而,回溯计算代价很高,如果设计失误,将导致失控。回溯是影响整体性能的唯一因素,理解它的工作原理,以及如何减小使用频率,可能是编写高效正则表达式的关键点

当一个正则表达式扫描目标字符串时,从左到右逐个扫描正则表达式的组成部分,在每个位置上测试能不能找到一个匹配。对于每一个量词和分支,都必须确定如何继续进行。如果是一个量词(如*、+?或者{2,}),那么正则表达式必须确定何时尝试匹配更多的字符;如果遇到分支(通过|操作符),那么正则表达式必须从这些选项中选择一个进行尝试。

当正则表达式做出这样的决定时,如果有必要,它会记住另一个选项,以备返回后使用。如果所选方案匹配成功,正则表达式将继续扫描正则表达式模板,如果其余部分匹配也成功了,那么匹配就结束了。但是,如果所选择的方案未能发现相应匹配,或者后来的匹配也失败了,正则表达式将回溯到最后一个决策点,然后在剩余的选项中选择一个。继续这样,直到找到一个匹配,或者量词和分支选项的所有可能的排列组合都尝试失败后放弃这一过程,然后移动到此过程开始位置的下一个字符上,重复此过程。

例如,下面的代码演示了这一过程是如何通过回溯处理分支的。

/h(ello|appy) hippo/.test("hello there, happy hippo");
登录后复制

上面一行正则表达式用于匹配“hello hippo”或“happy hippo”。测试一开始要查找一个h,目标字符串的第一个字母恰好就是h,立刻就找到了。接下来,子表达式(ello|appy)提供了两个处理选项。正则表达式选择最左边的选项(分支选择总是从左到右进行),检查ello 是否匹配字符串的下一个字符,确实匹配,然后正则表达式又匹配了后面的空格。

然而,在接下来的匹配中正则表达式“走进了死胡同”,因为hippo 中的h 不能匹配字符串中的下一个字母t。此时正则表达式还不能放弃,因为它还没有尝试过所有的选择,随后它回溯到最后一个检查点(在匹配了首字母h 之后的那个位置上)并尝试匹配第二个分支选项。但由于匹配没有成功,而且也没有更多的选项了,正则表达式认为从字符串的第一个字符开始匹配是不能成功的,因此它从第二个字符开始重新进行查找。正则表达式没有找到h,继续向后找,直到第14 个字母才找到,它匹配happy 的那个h。随后正则表达式再次进入分支过程,这次ello 未能匹配,但在回溯之后的第二次分支中,它匹配了整个字符串“happy hippo”,匹配成功了。

再如,下面代码演示了带重复量词的回溯。

var str = "

Para 1.

" +"" +"

Para 2.

" +"

p.

"; /

.*<\/p>/i.test(str);

登录后复制

正则表达式先匹配了字符串开始的3个字母

,然后是.*。点号表示匹配除换行符以外的任意字符,星号这个“贪婪”量词表示重复零次或多次,匹配尽量多的次数。因为目标字符串中没有换行符,正则表达式将匹配剩下的全部字符串!不过由于正则表达式模板中还有更多内容需要匹配,所以正则表达式尝试匹配<。由于在字符串末尾匹配不成功,因此每次回溯一个字符,继续尝试匹配<,直到正则表达式回到

标签的 <位置。接下来尝试匹配\ (转义反斜杠),匹配成功,然后匹配p,匹配不成功。正则表达式继续回溯,重复此过程,直到第二段末尾时终于匹配了< p> 。匹配返回成功需要从第一段头部一直扫描到最后一个的末尾,这可能不是我们想要的结果。

将正则表达式中的“贪婪”量词*改为“懒惰”(又名“非贪婪”)量词*?,以匹配单个段落。“懒惰”量词的回溯工作以相反方式进行。当正则表达式/

.*?<\/p>/推进到.*?时,首先尝试全部跳过,然后继续匹配<\/p>。

这样做是因为*?匹配零次或多次,尽可能少重复,尽可能少意味着可以重复零次。但是,当随后的 <在字符串的这一点上匹配失败时,正则表达式回溯并尝试下一个最小的字符数:1个。正则表达式继续像这样向前回溯到第一段的末尾,在那里量词后面的<\ p> 得到完全匹配。

如果目标字符串只有一个段落,那么此正则表达式的“贪婪”版本和“懒惰”版本是等价的,但尝试匹配的过程不同。

当一个正则表达式占用浏览器几秒甚至更长时间时,问题原因很可能是回溯失控。为说明此问题,给出下面的正则表达式,它的目标是匹配整个HTML文件。此表达式被拆分成多行是为了适合页面显示。与其他正则表达式不同,JavaScript在没有选项时可使点号匹配任意字符,包括换行符,所以此例中以[\s\S]匹配任意字符。

/[\s\S]*?[\s\S]*?[\s\S]*?<\/title>[\s\S]*?<\/head> [\s\S]*?<body>[\s\S]*?<\/body>[\s\S]*?<\/html>/</pre>
         <div class="contentsignin">
          登录后复制
         </div>
        </div>
        <p style="text-align: left;">此正则表达式匹配在正常HTML 字符串时工作良好,但当目标字符串缺少一个或多个标签时,就会变得十分糟糕。例如标签缺失,最后一个[\s\S]*?将扩展到字符串的末尾,因为在那里没有发现标签,然后正则表达式将查看此前的[\s\S]*?队列记录的回溯位置,使它们进一步扩大。正则表达式尝试扩展倒数第二个[\s\S]*?—用它匹配标签,就是此前匹配过正则表达式模板<\/body>的那个标签,然后继续查找第二个标签,直到字符串的末尾。当所有这些步骤都失败时,倒数第三个[\s\S]*?将被扩展,直至字符串的末尾,依此类推。</p>
        <p style="text-align: left;">此类问题的解决办法在于尽可能具体地指出分隔符之间的字符匹配形式,如模板“.*?”用于匹配双引号包围的一个字符串。用更具体的[^"\rn]*取代过于宽泛的.*?就去除了回溯时可能发生的几种情况,如尝试用点号匹配引号,或者扩展搜索超出预期范围。</p>
        <p style="text-align: left;">在HTML 的例子中解决办法不是那么简单。不能使用否定<a href="//m.sbmmt.com/code/6739.html" target="_blank">字符类型</a>,如用[^<]替代[\s\S],因为在搜索过程中可能会遇到其他类型的标签。但是,可以通过重复一个非捕获组来达到同样效果,它包含一个回溯(阻塞下一个所需的标签)和[\s\S](任意字符)元序列。这样可以确保中间位置上查找的每个标签都会失败。然后,更重要的是,[\s\S]模板在回溯过程中阻塞的标签在被发现之前不能被扩展。应用此方法后对正则表达式的最终修改如下:</p>
        <div class="code" style="position:relative; padding:0px; margin:0px;">
         <pre class="brush:php;toolbar:false">/<html>(?:(?!<head>)[\s\S])*<head>(?:(?!<title>)[\s\S])*<title> (?:(?!<\/title>)[\s\S])*<\/title>(?:(?!<\/head>)[\s\S])*<\/head> (?:(?!<body>)[\s\S])*<body>(?:(?!<\/body>)[\s\S])*<\/body> (?:(?!<\/html>)[\s\S])*<\/html>/</pre>
         <div class="contentsignin">
          登录后复制
         </div>
        </div>
        <p style="text-align: left;">虽然这样做消除了潜在的回溯失控,并允许正则表达式在匹配不完整HTML字符串失败时的使用时间与文本长度呈线性关系,但是正则表达式的效率并没有提高。像这样为每个匹配字符进行多次前瞻,缺乏效率,而且成功匹配过程也相当慢。匹配较短字符串时使用此方法相当不错,而匹配一个HTML 文件可能需要前瞻并测试上千次。</p>
        <p>相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!</p>
        <p>推荐阅读:</p>
        <p><a href="//m.sbmmt.com/js-tutorial-390809.html" target="_blank">正则全局匹配模式g修饰符的使用详解</a><br></p>
        <p><a href="//m.sbmmt.com/js-tutorial-390807.html" target="_blank">正则表达式小结(实战归纳)</a><br></p>
        <p>以上是js里如何正确理解正则表达式的回溯的详细内容。更多信息请关注PHP中文网其他相关文章!</p>
       </位置。接下来尝试匹配\>
      </div>
     </div>
     <div style="height: 25px;">
      <div class="wzconBq" style="display: inline-flex;">
       <span>相关标签:</span>
       <div class="wzcbqd">
        <a onclick="hits_log(2,'www',this);" href-data="//m.sbmmt.com/zh/search?word=javascript" target="_blank">javascript</a>
        <a onclick="hits_log(2,'www',this);" href-data="//m.sbmmt.com/zh/search?word=表达式" target="_blank">表达式</a>
       </div>
      </div>
      <div style="display: inline-flex;float: right; color:#333333;">
       来源:php.cn
      </div>
     </div>
     <div class="wzconOtherwz">
      <a href="//m.sbmmt.com/zh/faq/390813.html" title=""><span>上一篇:正则表达式的{n,m}量词如何使用</span></a>
      <a href="//m.sbmmt.com/zh/faq/390818.html" title=""><span>下一篇:JS实现网站悬浮广告的代码</span></a>
     </div>
     <div class="wzconShengming">
      <div class="bzsmdiv">
       本站声明
      </div>
      <div>
       本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
      </div>
     </div>
     <div class="wwads-cn wwads-horizontal" data-id="156" style="max-width:955px"></div>
     <div class="wzconZzwz">
      <div class="wzconZzwztitle">
       作者最新文章
      </div>
      <ul>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/402647.html">最新php程序员工具箱 v1.0版本介绍</a>
        </div>
        <div>
         2018-06-11 11:57:34
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403921.html">vue.js路由失效如何处理</a>
        </div>
        <div>
         2018-06-15 15:55:18
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403914.html">怎样使用js解析数据库(附代码)</a>
        </div>
        <div>
         2018-06-15 15:49:00
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403911.html">怎样在项目中使用js绑定DOM事件</a>
        </div>
        <div>
         2018-06-15 15:46:15
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403909.html">怎样操作JS字符串与特殊字符</a>
        </div>
        <div>
         2018-06-15 15:42:38
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403907.html">如何在项目中使用jQuery内each方法</a>
        </div>
        <div>
         2018-06-15 15:40:34
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403904.html">如何利用jquery做出文件上传加载</a>
        </div>
        <div>
         2018-06-15 15:39:32
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403902.html">怎样对JS原型与原型链进行使用</a>
        </div>
        <div>
         2018-06-15 15:37:14
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403899.html">Angular CLI+Angular 5实战项目演示</a>
        </div>
        <div>
         2018-06-15 15:34:21
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots"></span>
         <a target="_blank" href="//m.sbmmt.com/zh/faq/403890.html">使用jQuery替换节点元素(附代码)</a>
        </div>
        <div>
         2018-06-15 15:22:51
        </div></li>
      </ul>
     </div>
     <div class="wzconZzwz">
      <div class="wzconZzwztitle">
       最新问题
      </div>
      <div class="wdsyContent">
       <div class="wdsyConDiv flexRow wdsyConDiv1">
        <div class="wdcdContent flexColumn">
         <a href="//m.sbmmt.com/zh/wenda/173508.html" target="_blank" title="使用 AJAX、PHP 和服务器发送事件从 OpenAI 的 API 流式传输数据" class="wdcdcTitle">使用 AJAX、PHP 和服务器发送事件从 OpenAI 的 API 流式传输数据</a>
         <a href="//m.sbmmt.com/zh/wenda/173508.html" class="wdcdcCons">如何使用服务器发送事件(SSE)将数据从上述API流式传输到使用JavaScript和PHP的浏览器客户端?我已经研究这个问题好几个小时了,但我似乎无法弄清楚出了什么问题。作为参考...</a>
         <div class="wdcdcInfo flexRow">
          <div class="wdcdcileft">
           <span class="wdcdciSpan">来自于 2023-11-11 12:03:23</span>
          </div>
          <div class="wdcdciright flexRow">
           <div class="wdcdcirdz flexRow ira">
            <b class="wdcdcirdzi"></b>0
           </div>
           <div class="wdcdcirpl flexRow ira">
            <b class="wdcdcirpli"></b>1
           </div>
           <div class="wdcdcirwatch flexRow ira">
            <b class="wdcdcirwatchi"></b>497
           </div>
          </div>
         </div>
        </div>
       </div>
       <div class="wdsyConLine wdsyConLine2"></div>
       <div class="wdsyConDiv flexRow wdsyConDiv1">
        <div class="wdcdContent flexColumn">
         <a href="//m.sbmmt.com/zh/wenda/173469.html" target="_blank" title="未捕获的类型错误:无法设置未定义的属性(设置'innerHTML”)" class="wdcdcTitle">未捕获的类型错误:无法设置未定义的属性(设置'innerHTML”)</a>
         <a href="//m.sbmmt.com/zh/wenda/173469.html" class="wdcdcCons">我正在尝试使用php创建一个网页,在“连续文本框”类(由我的类定义)的元素上,单击时必须启动一个Javascript函数,该函数应该更改另一个函数的内容id“harta-modal...</a>
         <div class="wdcdcInfo flexRow">
          <div class="wdcdcileft">
           <span class="wdcdciSpan">来自于 2023-11-08 21:06:09</span>
          </div>
          <div class="wdcdciright flexRow">
           <div class="wdcdcirdz flexRow ira">
            <b class="wdcdcirdzi"></b>0
           </div>
           <div class="wdcdcirpl flexRow ira">
            <b class="wdcdcirpli"></b>1
           </div>
           <div class="wdcdcirwatch flexRow ira">
            <b class="wdcdcirwatchi"></b>278
           </div>
          </div>
         </div>
        </div>
       </div>
       <div class="wdsyConLine wdsyConLine2"></div>
       <div class="wdsyConDiv flexRow wdsyConDiv1">
        <div class="wdcdContent flexColumn">
         <a href="//m.sbmmt.com/zh/wenda/173425.html" target="_blank" title="JavaScript中如何获取CSS/HTML命名颜色的RGB值" class="wdcdcTitle">JavaScript中如何获取CSS/HTML命名颜色的RGB值</a>
         <a href="//m.sbmmt.com/zh/wenda/173425.html" class="wdcdcCons">我已经建立了一个名为[name-rgb]的Javascript对象。你的基本:namedColors={AliceBlue:[240,248,255],AntiqueWhite:[...</a>
         <div class="wdcdcInfo flexRow">
          <div class="wdcdcileft">
           <span class="wdcdciSpan">来自于 2023-11-06 09:05:50</span>
          </div>
          <div class="wdcdciright flexRow">
           <div class="wdcdcirdz flexRow ira">
            <b class="wdcdcirdzi"></b>0
           </div>
           <div class="wdcdcirpl flexRow ira">
            <b class="wdcdcirpli"></b>2
           </div>
           <div class="wdcdcirwatch flexRow ira">
            <b class="wdcdcirwatchi"></b>210
           </div>
          </div>
         </div>
        </div>
       </div>
       <div class="wdsyConLine wdsyConLine2"></div>
       <div class="wdsyConDiv flexRow wdsyConDiv1">
        <div class="wdcdContent flexColumn">
         <a href="//m.sbmmt.com/zh/wenda/173404.html" target="_blank" title="为什么这么多 JavaScript 脚本要向事物附加随机数?碰撞?" class="wdcdcTitle">为什么这么多 JavaScript 脚本要向事物附加随机数?碰撞?</a>
         <a href="//m.sbmmt.com/zh/wenda/173404.html" class="wdcdcCons">我最近一直在学习JavaScript,并且看到了许多使用Math.rand()附加到链接的示例(Face book.com、可读性书签)。这解决了什么问题?Readability小...</a>
         <div class="wdcdcInfo flexRow">
          <div class="wdcdcileft">
           <span class="wdcdciSpan">来自于 2023-11-04 20:00:04</span>
          </div>
          <div class="wdcdciright flexRow">
           <div class="wdcdcirdz flexRow ira">
            <b class="wdcdcirdzi"></b>0
           </div>
           <div class="wdcdcirpl flexRow ira">
            <b class="wdcdcirpli"></b>2
           </div>
           <div class="wdcdcirwatch flexRow ira">
            <b class="wdcdcirwatchi"></b>296
           </div>
          </div>
         </div>
        </div>
       </div>
       <div class="wdsyConLine wdsyConLine2"></div>
       <div class="wdsyConDiv flexRow wdsyConDiv1">
        <div class="wdcdContent flexColumn">
         <a href="//m.sbmmt.com/zh/wenda/173339.html" target="_blank" title="识别 JavaScript 中的性能限制" class="wdcdcTitle">识别 JavaScript 中的性能限制</a>
         <a href="//m.sbmmt.com/zh/wenda/173339.html" class="wdcdcCons">我试图找到我的Javascript中的瓶颈。基本上我正在开发一个用Javascript编写的chrome扩展,它需要4-5秒来执行任务。该任务涉及大量代码,并且使用开发工具中内置的...</a>
         <div class="wdcdcInfo flexRow">
          <div class="wdcdcileft">
           <span class="wdcdciSpan">来自于 2023-10-31 20:47:17</span>
          </div>
          <div class="wdcdciright flexRow">
           <div class="wdcdcirdz flexRow ira">
            <b class="wdcdcirdzi"></b>0
           </div>
           <div class="wdcdcirpl flexRow ira">
            <b class="wdcdcirpli"></b>1
           </div>
           <div class="wdcdcirwatch flexRow ira">
            <b class="wdcdcirwatchi"></b>229
           </div>
          </div>
         </div>
        </div>
       </div>
       <div class="wdsyConLine wdsyConLine2"></div>
      </div>
     </div>
     <div class="wzconZt">
      <div class="wzczt-title">
       <div>
        相关专题
       </div>
       <a href="//m.sbmmt.com/zh/faq/zt" target="_blank">更多></a>
      </div>
      <div class="wzcttlist">
       <ul>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/jsszcd"><img src="https://img.php.cn/upload/subject/202407/22/2024072214415543594.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="js获取数组长度的方法"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/jsszcd" class="title-a-spanl" title=""><span>js获取数组长度的方法</span></a></li>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/jssxym"><img src="https://img.php.cn/upload/subject/202407/22/2024072214363232433.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="js刷新当前页面"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/jssxym" class="title-a-spanl" title=""><span>js刷新当前页面</span></a></li>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/jssswr"><img src="https://img.php.cn/upload/subject/202407/22/2024072214362363697.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="js四舍五入"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/jssswr" class="title-a-spanl" title=""><span>js四舍五入</span></a></li>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/jsscjddff"><img src="https://img.php.cn/upload/subject/202407/22/2024072214115932190.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="js删除节点的方法"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/jsscjddff" class="title-a-spanl" title=""><span>js删除节点的方法</span></a></li>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/javascriptzy"><img src="https://img.php.cn/upload/subject/202407/22/2024072214114396768.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="JavaScript转义字符"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/javascriptzy" class="title-a-spanl" title=""><span>JavaScript转义字符</span></a></li>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/jsscsjsdff"><img src="https://img.php.cn/upload/subject/202407/22/2024072214113439427.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="js生成随机数的方法"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/jsscsjsdff" class="title-a-spanl" title=""><span>js生成随机数的方法</span></a></li>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/rhqyjavascrip"><img src="https://img.php.cn/upload/subject/202407/22/2024072214085281458.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="如何启用JavaScript"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/rhqyjavascrip" class="title-a-spanl" title=""><span>如何启用JavaScript</span></a></li>
        <li class="ul-li"><a target="_blank" href="//m.sbmmt.com/zh/faq/jssymbol"><img src="https://img.php.cn/upload/subject/202407/22/2024072214060282401.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="Js中Symbol类详解"></a><a target="_blank" href="//m.sbmmt.com/zh/faq/jssymbol" class="title-a-spanl" title=""><span>Js中Symbol类详解</span></a></li>
       </ul>
      </div>
     </div>
    </div>
   </div>
   <div class="phpwzright">
    <div class="wzrOne">
     <div class="wzroTitle">
      热门推荐
     </div>
     <div class="wzroList">
      <ul>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots wzrolr"></span>
         <a style="height: auto;" title="js是什么意思" href="//m.sbmmt.com/zh/faq/482163.html">js是什么意思</a>
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots wzrolr"></span>
         <a style="height: auto;" title="js怎么将字符串转为数组?" href="//m.sbmmt.com/zh/faq/461802.html">js怎么将字符串转为数组?</a>
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots wzrolr"></span>
         <a style="height: auto;" title="javascript如何刷新页面" href="//m.sbmmt.com/zh/faq/473330.html">javascript如何刷新页面</a>
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots wzrolr"></span>
         <a style="height: auto;" title="js数组怎么删除某一项" href="//m.sbmmt.com/zh/faq/475790.html">js数组怎么删除某一项</a>
        </div></li>
       <li>
        <div class="wzczzwzli">
         <span class="layui-badge-dots wzrolr"></span>
         <a style="height: auto;" title="sqrt函数怎么使用" href="//m.sbmmt.com/zh/faq/415276.html">sqrt函数怎么使用</a>
        </div></li>
      </ul>
     </div>
    </div>
    <div class="wzrThree">
     <div class="wzrthree-title">
      <div>
       热门教程
      </div>
      <a target="_blank" href="//m.sbmmt.com/zh/course.html">更多></a>
     </div>
     <div class="wzrthreelist swiper2">
      <div class="wzrthreeTab  swiper-wrapper">
       <div class="check tabdiv swiper-slide" data-id="one">
        相关教程
        <div></div>
       </div>
       <div class="tabdiv swiper-slide" data-id="two">
        热门推荐
        <div></div>
       </div>
       <div class="tabdiv swiper-slide" data-id="three">
        最新课程
        <div></div>
       </div>
      </div>
      <ul class="one">
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/812.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/041/620debc3eab3f377.jpg" alt="最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)" href="//m.sbmmt.com/zh/course/812.html">最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)</a>
         <div class="wzrthreerb">
          <div>
           1394919
           <b class="kclbcollectb"></b>
          </div>
          <div class="courseICollection" data-id="812">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/74.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/068/6253d1e28ef5c345.png" alt="php入门教程之一周学会PHP"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="php入门教程之一周学会PHP" href="//m.sbmmt.com/zh/course/74.html">php入门教程之一周学会PHP</a>
         <div class="wzrthreerb">
          <div>
           4206633
           <b class="kclbcollectb"></b>
          </div>
          <div class="courseICollection" data-id="74">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/286.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/068/62590a2bacfd9379.png" alt="JAVA 初级入门视频教程"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="JAVA 初级入门视频教程" href="//m.sbmmt.com/zh/course/286.html">JAVA 初级入门视频教程</a>
         <div class="wzrthreerb">
          <div>
           2350947
           <b class="kclbcollectb"></b>
          </div>
          <div class="courseICollection" data-id="286">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/504.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/068/62590a67ce3a6655.png" alt="小甲鱼零基础入门学习Python视频教程"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="小甲鱼零基础入门学习Python视频教程" href="//m.sbmmt.com/zh/course/504.html">小甲鱼零基础入门学习Python视频教程</a>
         <div class="wzrthreerb">
          <div>
           493321
           <b class="kclbcollectb"></b>
          </div>
          <div class="courseICollection" data-id="504">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/2.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/068/6253de27bc161468.png" alt="PHP 零基础入门教程"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="PHP 零基础入门教程" href="//m.sbmmt.com/zh/course/2.html">PHP 零基础入门教程</a>
         <div class="wzrthreerb">
          <div>
           826321
           <b class="kclbcollectb"></b>
          </div>
          <div class="courseICollection" data-id="2">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
      </ul>
      <ul class="two" style="display: none;">
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/812.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/041/620debc3eab3f377.jpg" alt="最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)" href="//m.sbmmt.com/zh/course/812.html">最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)</a>
         <div class="wzrthreerb">
          <div>
           1394919次学习
          </div>
          <div class="courseICollection" data-id="812">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/286.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/068/62590a2bacfd9379.png" alt="JAVA 初级入门视频教程"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="JAVA 初级入门视频教程" href="//m.sbmmt.com/zh/course/286.html">JAVA 初级入门视频教程</a>
         <div class="wzrthreerb">
          <div>
           2350947次学习
          </div>
          <div class="courseICollection" data-id="286">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/504.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/068/62590a67ce3a6655.png" alt="小甲鱼零基础入门学习Python视频教程"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="小甲鱼零基础入门学习Python视频教程" href="//m.sbmmt.com/zh/course/504.html">小甲鱼零基础入门学习Python视频教程</a>
         <div class="wzrthreerb">
          <div>
           493321次学习
          </div>
          <div class="courseICollection" data-id="504">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/901.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/067/64be28a53a4f6310.png" alt="Web前端开发极速入门"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="Web前端开发极速入门" href="//m.sbmmt.com/zh/course/901.html">Web前端开发极速入门</a>
         <div class="wzrthreerb">
          <div>
           213418次学习
          </div>
          <div class="courseICollection" data-id="901">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/234.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/068/62611f57ed0d4840.jpg" alt="零基础精通 PS 视频教程"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="零基础精通 PS 视频教程" href="//m.sbmmt.com/zh/course/234.html">零基础精通 PS 视频教程</a>
         <div class="wzrthreerb">
          <div>
           843269次学习
          </div>
          <div class="courseICollection" data-id="234">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
      </ul>
      <ul class="three" style="display: none;">
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/1648.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/067/662b5d34ba7c0227.png" alt="【web前端】Node.js快速入门"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="【web前端】Node.js快速入门" href="//m.sbmmt.com/zh/course/1648.html">【web前端】Node.js快速入门</a>
         <div class="wzrthreerb">
          <div>
           3149次学习
          </div>
          <div class="courseICollection" data-id="1648">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/1647.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/067/6628cc96e310c937.png" alt="国外Web开发全栈课程全集"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="国外Web开发全栈课程全集" href="//m.sbmmt.com/zh/course/1647.html">国外Web开发全栈课程全集</a>
         <div class="wzrthreerb">
          <div>
           2549次学习
          </div>
          <div class="courseICollection" data-id="1647">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/1646.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/067/662221173504a436.png" alt="Go语言实战之 GraphQL"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="Go语言实战之 GraphQL" href="//m.sbmmt.com/zh/course/1646.html">Go语言实战之 GraphQL</a>
         <div class="wzrthreerb">
          <div>
           1989次学习
          </div>
          <div class="courseICollection" data-id="1646">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/1645.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/067/662077e163124646.png" alt="550W粉丝大佬手把手从零学JavaScript"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="550W粉丝大佬手把手从零学JavaScript" href="//m.sbmmt.com/zh/course/1645.html">550W粉丝大佬手把手从零学JavaScript</a>
         <div class="wzrthreerb">
          <div>
           465次学习
          </div>
          <div class="courseICollection" data-id="1645">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
       <li><a target="_blank" href="//m.sbmmt.com/zh/course/1644.html" title="" class="wzrthreelaimg"><img src="https://img.php.cn/upload/course/000/000/067/6616418ca80b8916.png" alt="python大神Mosh,零基础小白6小时完全入门"></a>
        <div class="wzrthree-right">
         <a target="_blank" title="python大神Mosh,零基础小白6小时完全入门" href="//m.sbmmt.com/zh/course/1644.html">python大神Mosh,零基础小白6小时完全入门</a>
         <div class="wzrthreerb">
          <div>
           10895次学习
          </div>
          <div class="courseICollection" data-id="1644">
           <b class="nofollow small-nocollect"></b>
          </div>
         </div>
        </div></li>
      </ul>
     </div>
    </div>
    <div class="wzrFour">
     <div class="wzrfour-title">
      <div>
       最新下载
      </div>
      <a href="//m.sbmmt.com/zh/xiazai">更多></a>
     </div>
     <div class="wzrfourList swiper3">
      <div class="wzrfourlTab swiper-wrapper">
       <div class="check swiper-slide" data-id="onef">
        网站特效
        <div></div>
       </div>
       <div class="swiper-slide" data-id="twof">
        网站源码
        <div></div>
       </div>
       <div class="swiper-slide" data-id="threef">
        网站素材
        <div></div>
       </div>
       <div class="swiper-slide" data-id="fourf">
        前端模板
        <div></div>
       </div>
      </div>
      <ul class="onef">
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[表单按钮] jQuery企业留言表单联系代码" href="//m.sbmmt.com/zh/xiazai/js/8071">[表单按钮] jQuery企业留言表单联系代码</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[播放器特效] HTML5 MP3音乐盒播放特效" href="//m.sbmmt.com/zh/xiazai/js/8070">[播放器特效] HTML5 MP3音乐盒播放特效</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[菜单导航] HTML5炫酷粒子动画导航菜单特效" href="//m.sbmmt.com/zh/xiazai/js/8069">[菜单导航] HTML5炫酷粒子动画导航菜单特效</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[表单按钮] jQuery可视化表单拖拽编辑代码" href="//m.sbmmt.com/zh/xiazai/js/8068">[表单按钮] jQuery可视化表单拖拽编辑代码</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[播放器特效] VUE.JS仿酷狗音乐播放器代码" href="//m.sbmmt.com/zh/xiazai/js/8067">[播放器特效] VUE.JS仿酷狗音乐播放器代码</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[html5特效] 经典html5推箱子小游戏" href="//m.sbmmt.com/zh/xiazai/js/8066">[html5特效] 经典html5推箱子小游戏</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[图片特效] jQuery滚动添加或减少图片特效" href="//m.sbmmt.com/zh/xiazai/js/8065">[图片特效] jQuery滚动添加或减少图片特效</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a target="_blank" title="[相册特效] CSS3个人相册封面悬停放大特效" href="//m.sbmmt.com/zh/xiazai/js/8064">[相册特效] CSS3个人相册封面悬停放大特效</a>
        </div></li>
      </ul>
      <ul class="twof" style="display:none">
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8328" title="[前端模板] 家居装潢清洁维修服务公司网站模板" target="_blank">[前端模板] 家居装潢清洁维修服务公司网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8327" title="[前端模板] 清新配色个人求职简历引导页模板" target="_blank">[前端模板] 清新配色个人求职简历引导页模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8326" title="[前端模板] 设计师创意求职简历网页模板" target="_blank">[前端模板] 设计师创意求职简历网页模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8325" title="[前端模板] 现代工程建筑公司网站模板" target="_blank">[前端模板] 现代工程建筑公司网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8324" title="[前端模板] 教育服务机构响应式HTML5模板" target="_blank">[前端模板] 教育服务机构响应式HTML5模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8323" title="[前端模板] 网上电子书店商城网站模板" target="_blank">[前端模板] 网上电子书店商城网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8322" title="[前端模板] IT技术解决互联网公司网站模板" target="_blank">[前端模板] IT技术解决互联网公司网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8321" title="[前端模板] 紫色风格外汇交易服务网站模板" target="_blank">[前端模板] 紫色风格外汇交易服务网站模板</a>
        </div></li>
      </ul>
      <ul class="threef" style="display:none">
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3078" target="_blank" title="[PNG素材] 可爱的夏天元素矢量素材(EPS+PNG)">[PNG素材] 可爱的夏天元素矢量素材(EPS+PNG)</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3077" target="_blank" title="[PNG素材] 四个红的的 2023 毕业徽章矢量素材(AI+EPS+PNG)">[PNG素材] 四个红的的 2023 毕业徽章矢量素材(AI+EPS+PNG)</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3076" target="_blank" title="[banner图] 唱歌的小鸟和装满花朵的推车设计春天banner矢量素材(AI+EPS)">[banner图] 唱歌的小鸟和装满花朵的推车设计春天banner矢量素材(AI+EPS)</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3075" target="_blank" title="[PNG素材] 金色的毕业帽矢量素材(EPS+PNG)">[PNG素材] 金色的毕业帽矢量素材(EPS+PNG)</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3074" target="_blank" title="[PNG素材] 黑白风格的山脉图标矢量素材(EPS+PNG)">[PNG素材] 黑白风格的山脉图标矢量素材(EPS+PNG)</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3073" target="_blank" title="[PNG素材] 不同颜色披风和不同姿势的超级英雄剪影矢量素材(EPS+PNG)">[PNG素材] 不同颜色披风和不同姿势的超级英雄剪影矢量素材(EPS+PNG)</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3072" target="_blank" title="[banner图] 扁平风格的植树节banner矢量素材(AI+EPS)">[banner图] 扁平风格的植树节banner矢量素材(AI+EPS)</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/sucai/3071" target="_blank" title="[PNG素材] 九个漫画风格的爆炸聊天气泡矢量素材(EPS+PNG)">[PNG素材] 九个漫画风格的爆炸聊天气泡矢量素材(EPS+PNG)</a>
        </div></li>
      </ul>
      <ul class="fourf" style="display:none">
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8328" target="_blank" title="[前端模板] 家居装潢清洁维修服务公司网站模板">[前端模板] 家居装潢清洁维修服务公司网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8327" target="_blank" title="[前端模板] 清新配色个人求职简历引导页模板">[前端模板] 清新配色个人求职简历引导页模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8326" target="_blank" title="[前端模板] 设计师创意求职简历网页模板">[前端模板] 设计师创意求职简历网页模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8325" target="_blank" title="[前端模板] 现代工程建筑公司网站模板">[前端模板] 现代工程建筑公司网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8324" target="_blank" title="[前端模板] 教育服务机构响应式HTML5模板">[前端模板] 教育服务机构响应式HTML5模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8323" target="_blank" title="[前端模板] 网上电子书店商城网站模板">[前端模板] 网上电子书店商城网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8322" target="_blank" title="[前端模板] IT技术解决互联网公司网站模板">[前端模板] IT技术解决互联网公司网站模板</a>
        </div></li>
       <li>
        <div class="wzrfourli">
         <span class="layui-badge-dots wzrflr"></span>
         <a href="//m.sbmmt.com/zh/xiazai/code/8321" target="_blank" title="[前端模板] 紫色风格外汇交易服务网站模板">[前端模板] 紫色风格外汇交易服务网站模板</a>
        </div></li>
      </ul>
     </div>
    </div>
   </div>
  </div>
  <div class="phpFoot">
   <div class="phpFootIn">
    <div class="phpFootCont">
     <div class="phpFootLeft">
      <dl>
       <dt>
        <a href="//m.sbmmt.com/zh/about/us.html" rel="nofollow" target="_blank" title="关于我们" class="cBlack">关于我们</a>
        <a href="//m.sbmmt.com/zh/about/disclaimer.html" rel="nofollow" target="_blank" title="免责声明" class="cBlack">免责声明</a>
        <a href="//m.sbmmt.com/zh/update/article_0_1.html" target="_blank" title="Sitemap" class="cBlack">Sitemap</a>
        <div class="clear"></div>
       </dt>
       <dd class="cont1">
        PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!
       </dd>
      </dl>
     </div>
    </div>
   </div>
  </div>
  <input type="hidden" id="verifycode" value="/captcha.html">
  <link rel="stylesheet" id="_main-css" href="//m.sbmmt.com/static/css/viewer.min.css?2" type="text/css" media="all">
 </body>
</html>