这是我的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),有些则更复杂。
问题:
基于以上所述,我需要做些什么才能使正则表达式不混淆字符串?
答案 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>