JS RegExp 用于替换元素属性内部的<和>



我希望在html元素属性中,或者换句话说,在=""之间,用<>替换&lt;&gt;

我自己也尝试过,但我什么都不匹配。regexp的分解也很好,所以我可以尝试理解它,并最终自己编写这些内容。

您可以使用while循环来执行此操作,该循环检查是否仍有标签要替换:

var htmlString = '<div id="&lt;lol&gt;"><span title="&lt;&gt;&lt; &lt;&gt;&lt; &lt;&gt;&lt; fish">hover for fishies</span></div>';
while (htmlString.match(/="([^"]*)&[gl]t;([^"]*)"/g)) {
htmlString = htmlString.replace(/="([^"]*)&gt;([^"]*)"/g, '="$1>$2"')
.replace(/="([^"]*)&lt;([^"]*)"/g, '="$1<$2"');
}

此循环将一直进行,直到HTML字符串中没有&gt;&lt;匹配项为止。

这不能在单个regex替换中完成(或者至少据我所知),因为您需要匹配=""之间的每个&lt;&gt;。使用regex,这意味着您必须执行类似/="([^"]*)(&[lg]t;([^"]*))*"/g的操作来匹配所有这些组,但这意味着您无法再检索捕获组,这将使用某些东西替换它变得不可能。

然而,您也可以使用replace:上的回调函数来实现这一点

var htmlString = '<div id="&lt;lol&gt;"><span title="&lt;&gt;&lt; &lt;&gt;&lt; &lt;&gt;&lt; fish">hover for fishies</span></div>';
htmlString = htmlString.replace(/="[^"]*&[gl]t;[^"]*"/g, function(match) {
return match.replace(/&gt;/g, '>').replace(/&lt;/g, '<'); 
});

这将首先匹配其中包含&lt;&gt;的每个属性,然后对字符串的匹配部分执行替换。

string.replace(/="[^"]+"/g,function($0){return $0.replace(/&lt;/g,"<").replace(/&gt;/g,">");})

这条线的作用:

  • 在字符串中,搜索以="开头、以"结尾的文本
  • 在此文本中:将所有&lt;替换为<
  • 在此文本中:将所有&gt;替换为>

在函数中,$0表示匹配字符串="[^"]+"

有关字符串替换的更多详细信息,请访问此页面。

如果您在浏览器中执行此操作,请尝试以下操作:

function removeDoubleEncoding( element ){
Array.prototype.forEach.call( element.attributes, function replaceString( attribute ){
attribute.value = attribute.value.replace( '&lt;', '<' ).replace( '&gt;', '>' );
} );
}

因此:

<body class="&lt;erg&gt;">

…您可以应用以下功能…

removeDoubleEncoding( document.body );

…最后得到:

<body class="<erg>">

最新更新