首页 > 开发 > JavaScript > 正文

巧解 JavaScript 中的嵌套替换(强大正则)

2020-03-22 17:32:57
字体:
来源:转载
供稿:网友
网友wys提问:如何仅使用JavaScript支持的正则语法,将

lastIndex这样的东东。根据这个东东,我形成了这样的思路:
先按外层循环,找到第一组较大的匹配。正则代码是 table[^ ]* [/s/S]*? //table
定位到这次匹配结束的起始位置,替换掉这一段字串中所有的 p 。
循环执行。
我觉得上述思路大致清晰,但是细节太多(每次匹配涉及3个位置点,一个长度),解起来并非从容不迫,最终的代码想必也不会赏心悦目;尤为重要的是,整个思路像是原始的 Crack,而不是高手的 Hack 。而且思路与正则关系不大。我决定换一条路。

思路二

关键是循环和嵌套。还好不是盗梦空间的深层递归。能否将匹配的内容保护起来,替换完之后再放回原位呢?

想到这里,就豁然开朗了。

思路:先找到所有的匹配内容,记路在数组inner中;

同时使用该正则,将原字串split为另一个数组wrapper;

一个重要的特点是,wrapper一定比inner多一个元素,它一一将inner项隔开,并处于最外层。wrapper 和 inner 的关系,就像是一个手掌的5根指头与4个指缝的关系。将中间的元素取出,记下位置,等处理完之后,再将所有的元素粘合在一起。就是这样简单。代码如下(为了让问题更有普使性,我稍改了一下源字串):

复制代码 代码如下:
script type="text/javascript"
var str=" p table p , p /table p table p p /table p table p p /table

var patt=/ table[^ ]* [/s/S]*? //table
var wrapper_result=str.split(patt);
var inner_result = str.match(/ table[^ ]* [/s/S]*? //table /ig);

var len=inner_result.length;
var final=wrapper_result[0];

for (i=0; i i++)
{
tmp=inner_result[i].replace(/ p /gi," br
final+=tmp+wrapper_result[i+1];
}
alert(final);
/script

贴图:


更新

果然是能人辈出,评论更精彩!请看评论中的这则代码:
复制代码 代码如下: alert(sourcestr.replace(/ table.*?//table /ig, function($1){return $1.replace(/ p /ig," br ")}));
PS: 本站刚刚添加了评论中代码的解析,可以贴代码了。格式见评论部分的图例显示。谢谢合作!PHP教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表