我希望在html元素属性中,或者换句话说,在="
和"
之间,用<
和>
替换<
和>
。
我自己也尝试过,但我什么都不匹配。regexp的分解也很好,所以我可以尝试理解它,并最终自己编写这些内容。
您可以使用while
循环来执行此操作,该循环检查是否仍有标签要替换:
var htmlString = '<div id="<lol>"><span title="<>< <>< <>< fish">hover for fishies</span></div>';
while (htmlString.match(/="([^"]*)&[gl]t;([^"]*)"/g)) {
htmlString = htmlString.replace(/="([^"]*)>([^"]*)"/g, '="$1>$2"')
.replace(/="([^"]*)<([^"]*)"/g, '="$1<$2"');
}
此循环将一直进行,直到HTML字符串中没有>
或<
匹配项为止。
这不能在单个regex替换中完成(或者至少据我所知),因为您需要匹配="
和"
之间的每个<
或>
。使用regex,这意味着您必须执行类似/="([^"]*)(&[lg]t;([^"]*))*"/g
的操作来匹配所有这些组,但这意味着您无法再检索捕获组,这将使用某些东西替换它变得不可能。
然而,您也可以使用replace:上的回调函数来实现这一点
var htmlString = '<div id="<lol>"><span title="<>< <>< <>< fish">hover for fishies</span></div>';
htmlString = htmlString.replace(/="[^"]*&[gl]t;[^"]*"/g, function(match) {
return match.replace(/>/g, '>').replace(/</g, '<');
});
这将首先匹配其中包含<
或>
的每个属性,然后对字符串的匹配部分执行替换。
string.replace(/="[^"]+"/g,function($0){return $0.replace(/</g,"<").replace(/>/g,">");})
这条线的作用:
- 在字符串中,搜索以
="
开头、以"
结尾的文本 - 在此文本中:将所有
<
替换为<
- 在此文本中:将所有
>
替换为>
在函数中,$0
表示匹配字符串="[^"]+"
。
有关字符串替换的更多详细信息,请访问此页面。
如果您在浏览器中执行此操作,请尝试以下操作:
function removeDoubleEncoding( element ){
Array.prototype.forEach.call( element.attributes, function replaceString( attribute ){
attribute.value = attribute.value.replace( '<', '<' ).replace( '>', '>' );
} );
}
因此:
<body class="<erg>">
…您可以应用以下功能…
removeDoubleEncoding( document.body );
…最后得到:
<body class="<erg>">