正则表达式替换混乱字符串

时间:2018-03-07 23:27:34

标签: javascript regex

这是我的console.log:

str : <a href="Javascript:PostRating('','|P|622','+0')">+0</a>-D : replace : <a href="Javascript:PostRating('','|P|621','D')">D</a>a href="Javascript:PostRating('','|P|622','+0')">+0</a>-D

我有以下功能:

                function replaceAll_withMatching(str, find, rep, prodId) {
                    //console.log(str + " : " + find + " : " + rep + " : " + prodId);
                    var returnString = "";

                    if (find.toLowerCase() == str.toLowerCase()) {
                        returnString = rep;
                    } else {
                        escfind = "\\" + find ;
                        var regexp = new RegExp(escfind, "i");
                        var match = regexp.test(str);

                        if (match) {
                            var regAHREF = new RegExp("\\<a", "i");
                            var AHREFMatch = regAHREF.test(str);
                            if (AHREFMatch == false) {
                                str = str.replace(regexp, rep);
                                str = replaceProductAll(str, PRODUCT_PLACEHOLD, prodId);
                            } else {
                                var aTagText = $($.parseHTML(str)).filter('a').text();

                                if ((find !== aTagText) && (aTagText.indexOf(find) < 0)) {
                                    console.log(regexp);
                                    console.log("str : " + str + " : replace : " + str.replace(regexp, rep));   
                                    str = str.replace(regexp, rep);
                                }
                            }
                        }
                        //console.log(str);
                        returnString = str;
                    }

                    //returnString = replaceProductAll(returnString, PRODUCT_PLACEHOLD, prodId);
                    return returnString;
                }

此函数查找“<a>”标记,如果找不到,则执行替换。如果确实找到一个它有一些条件,如果一切都检查出来,它会做另一个替换。

我传入的字符串已经在+0:

上“解析”了
<a href="Javascript:PostRating('','|P|622','+0')">+0</a>-D

在第二遍中我期望它在上面的字符串中找到“D”,然后进行以下替换:

<a href="Javascript:PostRating('','|P|621','D')">D</a>

但正如你所看到的,在第二次替换之后,它会使字符串混乱并产生格式错误的HTML

<a href="Javascript:PostRating('','|P|621','D')">D</a>a href="Javascript:PostRating('','|P|622','+0')">+0</a>-D

更多背景信息:

我有一个字符串,需要对其进行替换。这是现有的代码,所以我无法重新编写函数。

原始字符串为:+0-D

此字符串多次传递到下面的函数中寻找匹配项,然后如果找到匹配项,它将用值替换它(也作为参数传入)。

第一次传递+0-D+0匹配并完成替换:<a href="Javascript:PostRating('','|P|622','+0')">+0</a>

然后下一次传递字符串:<a href="Javascript:PostRating('','|P|622','+0')">+0</a>-D。该函数将D视为匹配,看起来它尝试进行替换。但正是在这个传递中,字符串变得混乱。

最终我期待的是:

<a href="Javascript:PostRating('','|P|622','+0')">+0</a>-<a href="JavaScript:PostRating('','|P|622', 'D')">D</a>

这是我第二次尝试后的目标:

<a href="Javascript:PostRating('','|P|621','D')">D</a>a href="Javascript:PostRating('','|P|622','+0')">+0</a>-D

进一步背景:

+0-D是此函数处理的许多字符串之一。有些非常简单(即Just + 0),有些则更复杂。

问题:

基于以上所述,我需要做些什么才能使正则表达式不混淆字符串?

1 个答案:

答案 0 :(得分:0)

问题出在escfind:

escfind = "\\" + find;
var regexp = new RegExp(escfind,"i");
var match = regexp.test(str);

我做的第一件事是在第二个替换子句中我创建了一个新的RegExp而不使用"\\" + find;

                if((find !== aTagText) && (aTagText.indexOf(find) < 0)){
                    try{
                        var regexp2 = new RegExp(find,"i");
                        var match2 = regexp2.test(str);
                        console.log(str.replace(regexp2,rep));
                    }catch(err){
                        console.log(err);
                    }
                }

然后我的字符串开始按预期返回,但是,当我打开所有变量时,我得到意外的量词错误。

然后我发现了这个question - 这让我逃脱了我的发现: 一旦我用这个代替我的代码:

escfind = find.replace(/([*+.?|\\\[\]{}()])/g, '\\$1');

然后我按预期得到了输出:

<a href='+0'>+0</a>-<a href='D'>D</a>