站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        巧解 JavaScript 中的嵌套替換(強大正則)

        網(wǎng)友wys提問:如何僅使用JavaScript支持的正則語法,將

        復(fù)制代碼 代碼如下:
        <p>
        <table> <p> <p> </table>
        <table> <p> <p> </table>
        <p>

        中<table>…</table>之間的<p>都替換為<br/>?
        思考
        該問題的難點之一在于JavaScript支持的正則特性實在有限。樓主已經(jīng)想到了非JavaScript的解法,如下:

        復(fù)制代碼 代碼如下:
        re=/(?<=<table.*?)(<p>)(?=.*?</table>)/gi;
        alert (sourcestr.replace(re,”<br>”));

        嗯,思路大致是這樣。較真起來,即使JavaScript支持逆序環(huán)視,上面答案并不能夠如愿運行。原因是帶有量詞的逆序環(huán)視(即在(?<=)里面使用?, *, +, {}這樣的量詞)是更高級的的語法,極少有語言能夠支持(特例是.Net)。

        但是,像樓主這樣的正則問題應(yīng)該是很普便的一個問題,我們經(jīng)常需要循環(huán)地替換一些內(nèi)容。該如何解答呢?

        思路一

        閱讀JavaScript的文檔,我找到了lastIndex這樣的東東。根據(jù)這個東東,我形成了這樣的思路:
        •先按外層循環(huán),找到第一組較大的匹配。正則代碼是<table[^>]*>[sS]*?</table>
        •定位到這次匹配結(jié)束的起始位置,替換掉這一段字串中所有的<p>。
        •循環(huán)執(zhí)行。
        我覺得上述思路大致清晰,但是細節(jié)太多(每次匹配涉及3個位置點,一個長度),解起來并非從容不迫,最終的代碼想必也不會賞心悅目;尤為重要的是,整個思路像是原始的 Crack,而不是高手的 Hack 。而且思路與正則關(guān)系不大。我決定換一條路。

        思路二

        關(guān)鍵是循環(huán)和嵌套。還好不是盜夢空間的深層遞歸。能否將匹配的內(nèi)容保護起來,替換完之后再放回原位呢?

        想到這里,就豁然開朗了。

        思路:先找到所有的匹配內(nèi)容,記路在數(shù)組inner中;

        同時使用該正則,將原字串split為另一個數(shù)組wrapper;

        一個重要的特點是,wrapper一定比inner多一個元素,它一一將inner項隔開,并處于最外層。wrapper 和 inner 的關(guān)系,就像是一個手掌的5根指頭與4個指縫的關(guān)系。將中間的元素取出,記下位置,等處理完之后,再將所有的元素粘合在一起。就是這樣簡單。代碼如下(為了讓問題更有普使性,我稍改了一下源字串):

        復(fù)制代碼 代碼如下:
        <script type=”text/javascript”>
        var str=”<p> <table> <p> ,<p> </table> <p> <table> <p> <p> </table> <p> <table> <p> <p> </table>”;

        var patt=/<table[^>]*>[sS]*?</table>/i;
        var wrapper_result=str.split(patt);
        var inner_result = str.match(/<table[^>]*>[sS]*?</table>/ig);

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

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

        貼圖:
        巧解 JavaScript 中的嵌套替換(強大正則)

        更新

        果然是能人輩出,評論更精彩!請看評論中的這則代碼:

        復(fù)制代碼 代碼如下:
        alert(sourcestr.replace(/<table.*?/table>/ig, function($1){return $1.replace(/<p>/ig,”<br>”)}));

        PS: 本站剛剛添加了評論中代碼的解析,可以貼代碼了。格式見評論部分的圖例顯示。謝謝合作!

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产精品久久久天天影视| 精品国产91久久久久久久a | 69久久夜色精品国产69| 亚洲国产精品人人做人人爱| 国产精品狼人久久久久影院| 国产亚洲美女精品久久久久狼| 久久夜色精品国产网站| 中文字幕无码精品三级在线电影| 精品一区二区三区免费视频| 337P亚洲精品色噜噜| 国产精品久久一区二区三区| 国产精品天天看天天狠| 精品午夜福利在线观看| 久久亚洲精品成人av无码网站| 亚洲欧美日韩国产精品一区二区 | 国产精品青草视频免费播放| 亚洲国产精品国自产拍电影| 国产亚洲福利精品一区| 国产成人精品久久免费动漫| 国产AV国片精品| 东京热TOKYO综合久久精品| 国产午夜精品一区二区三区| 精品免费人成视频app| 久久精品中文騷妇女内射| 精品无人码麻豆乱码1区2区| 国产成人精品无码片区在线观看 | 国产网红无码精品视频| HEYZO无码综合国产精品227| 国产精品扒开腿做爽爽爽视频| 国产精品高清一区二区三区| 国产成人精品久久免费动漫| 久久精品国产亚洲一区二区| 亚洲第一精品在线视频| 99在线观看视频免费精品9| 国产精品成人啪精品视频免费| 国产精品一区二区三区免费| 久久久99精品成人片中文字幕| 四虎成人精品| 无码国内精品久久人妻| 99精品无人区乱码在线观看 | 国产精品国产亚洲精品看不卡|