Javascript 使用正则表达式替换XML属性内错误字符串中的嵌套引号
我在XML文件中有一个错误字符串:summary=“名称是“Rambo”。 我想使用regex将内部引号替换为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
“
,以便输出如下所示:
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,""")+'"';
}
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 : """;
});
}
console.log(innerToQuot('"The name is "Rambo"."'));
输出
"The name is "Rambo"."
summary="The name is "Rambo"."
在
更新:基于您更新的问题
解析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 : """;
});
}
var text = 'summary="The name is "Rambo"."',
newText = innerToQuot(text);
console.log(newText);
输出
"The name is "Rambo"."
summary="The name is "Rambo"."
在
将新字符串写回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解析器。