Javascript 使用正则表达式替换XML属性内错误字符串中的嵌套引号

Javascript 使用正则表达式替换XML属性内错误字符串中的嵌套引号,javascript,html,xml,regex,Javascript,Html,Xml,Regex,我在XML文件中有一个错误字符串:summary=“名称是“Rambo”。 我想使用regex将内部引号替换为“,以便输出如下所示: summary=“名字是“名称为“兰博” 我会这样做: <script type="text/javascript"> var str = '"The name is "Rambo"."'; if(str.charAt(0)=='"' && str.charAt(str.length-1)=='"'){ str = '"'+st

我在XML文件中有一个错误字符串:summary=“名称是“Rambo”。

我想使用regex将内部引号替换为
,以便输出如下所示:


summary=“名字是
兰博

这应该适合你,伙计

var outer='“名称为“Rambo”。”;
var-inner=outer.replace(/^“|“$/g,”);
var final='“'+内部。替换(/“/g'”)+'”;
//(字符串)=>“名称为“兰博”

Edit:您可以设置一点快捷方式,但它是不对称的,因为JavaScript不支持regexp lookbehind

var str='“名称为“Rambo”。”;
变量final='“'+str.substr(1).替换(/”(?!$)/g'”);
//(字符串)=>“名称为“兰博”

编辑2:使用
str.slice
这看起来更简单

var str='“名称为“Rambo”。”;
var final='“'+str.slice(1,-1).replace(/“/g'”)+'”;
//(字符串)=>“名称为“兰博”

我会这样做:

<script type="text/javascript">
var str = '"The name is "Rambo"."';
if(str.charAt(0)=='"' && str.charAt(str.length-1)=='"'){
    str = '"'+str.substr(1,str.length-2).replace(/"/g,"&quot;")+'"';
}
console.log(str);
</script>

var str='“名称为“Rambo”。”;
如果(str.charAt(0)='”&&str.charAt(str.length-1)='”){
str='“'+str.substr(1,str.length-2)。替换(/”/g,“)+”;
}
console.log(str);

替代正则表达式/
替换
解决方案

Javascript

function innerToQuot(text) {
    var last = text.length - 1;

    return text.replace(/"/g, function (character, position) {
        return (position === 0 || position === last) ? character : "&quot;";
    });
}

console.log(innerToQuot('"The name is "Rambo"."'));
输出

"The name is &quot;Rambo&quot;." 
summary="The name is &quot;Rambo&quot;." 

更新:基于您更新的问题

解析XML以获取字符串值,然后

function innerToQuot(text) {
    var match = text.match(/^([^"]*)(\s*=\s*)([\s\S]*)$/),
        result = "",
        first = 0,
        last = -1;

    if (match) {
        result += match[1] + match[2];
        text = match[3];
        last += text.length;
    } else {
        first = last;
    }

    return result + text.replace(/"/g, function (character, position) {
        return (position === first || position === last) ? character : "&quot;";
    });
}

var text = 'summary="The name is "Rambo"."',
    newText = innerToQuot(text);

console.log(newText);
输出

"The name is &quot;Rambo&quot;." 
summary="The name is &quot;Rambo&quot;." 


将新字符串写回XML

此脚本应修复属性中的所有错误引号:

var faultyXML='',
xmlString=faultyXML.replace(
/([^“=\s]+)=”(.+?)”(?=\s+[^“=\s]+=”\s*\/?>)/g,
函数(匹配、名称、值){
返回name+'“'+value.replace(/“/g,”)+';
}
);
正则表达式看起来很复杂,但不是:-)

([^“=\s]+)#与属性名称匹配的组。更简单:(\w+)
=“#值的开始
(.+?)#在…
“(?=#一个引号,后跟
\s+[^”=\s]+=“#空格、属性名称、等号和引号
|#或
\s*\/?>#标记结束
)

什么告诉你它们是内部引号(而不是两对连续的引号)?看起来很像外部引号实际上是字符串分隔符。您是否有
“名称为\“Rambo\”
或真正的
“名称为“Rambo”。”
?我有一个语法错误的XML文件。字符串在文本中有引号,例如summary=“画家的伟大作品”。因此,我需要用
”替换它们,以便语法正确。替换后的文本应该是summary=“Great work by
“the
“the
”画家的作品。所以你把它们放在一个大字符串中的某个地方,你不知道在哪里(下面的答案是什么)?是的,我最初试图玩
str.substr(1,str.length-2)
,但感觉有点难看是的,这就是为什么抛出
if
语句的原因,只是为了确保第一个和最后一个字符是双引号。您也可以使用更简单的
str.slice(1,-1)
您的解决方案工作得很好,但我的问题是关于XML文件。我有一个语法错误的XML文件。属性中的字符串在文本中有引号,例如summary=“画家的伟大作品”。所以我需要用
”替换它们,这样语法就正确了。替换后的文本应该是summary=“Great work by
“the
画家的作品。”这不是您发布的问题。如果需要解析XML,则需要XML解析器。