我知道我的问题可能看起来像this question的重复,但事实并非如此
我正在尝试使用JavsScript RegExp将来自服务器的 html text 中的类名称作为模板进行匹配,并将其替换为其他类名。
这里代码是什么样的:
<div class='a b c d'></div>
<!-- or -->
<div class="a b c d"></div>
<!-- There might be spaces after and before the = (the equal sign) -->
我希望将类“b”匹配为例如具有最高性能的
这是我使用的正则表达式,但它并不适用于所有情况,我不知道为什么:
var key = 'b';
statRegex = new RegExp('(<[\w+ class="[\\w\\s]*?)\\b('+key+')\\b([\\w\\s]*")');
html.replace( statRegex,'SomeOtherClass');// I may be mistake by the way I am replacing it here
答案 0 :(得分:4)
使用正则表达式,此模式应该适合您:
var r = new RegExp("(<\\w+?\\s+?class\\s*=\\s*['\"][^'\"]*?\\b)" + key + "\\b", "i");
# Λ Λ Λ
# |_________________________________________| |
# ____________| |
# [Creating a backreference] |
# [which will be accessible] [Using "i" makes the matching "case-insensitive".]_|
# [using $1 (see examples).] [You can omit "i" for case-sensitive matching. ]
E.g。
var oldClass = "b";
var newClass = "e";
var r = new RegExp("..." + oldClass + "...");
"<div class='a b c d'></div>".replace(r, "$1" + newClass);
// ^-- returns: <div class='a e c d'></div>
"<div class=\"a b c d\"></div>".replace(r, "$1" + newClass);
// ^-- returns: <div class="a e c d"></div>
"<div class='abcd'></div>".replace(r, "$1" + newClass);
// ^-- returns: <div class='abcd'></div> // <-- NO change
注意:
要使上述正则表达式起作用,类字符串中必须没有'
或"
即<div class="a 'b' c d"...
将不匹配。
答案 1 :(得分:2)
使用浏览器:
var str = '<div class=\'a b c d\'></div>\
<!-- or -->\
<div class="a b c d"></div>\
<!-- There might be spaces after and before the = (the equal sign) -->';
var wrapper = document.createElement('div');
wrapper.innerHTML = str;
var elements = wrapper.getElementsByClassName('b');
if (elements.length) {
// there are elements with class b
}
顺便说一下,getElementsByClassName()
在IE版本中得不到很好的支持,直到第9版;检查this answer是否有替代方案。
答案 2 :(得分:1)
正则表达式不适合解析HTML。 HTML不常见。
jQuery非常适合这里。
var html = 'Your HTML here...';
$('<div>' + html + '</div>').find('[class~="b"]').each(function () {
console.log(this);
});
选择器[class~="b"]
将选择包含单词class
的{{1}}属性的任何元素。最初的HTML包含在b
内,以使div
方法正常工作。
答案 3 :(得分:1)
在此测试:https://regex101.com/r/vnOFjm/1
regexp:(?:class|className)=(?:["']\W+\s*(?:\w+)\()?["']([^'"]+)['"]
const regex = /(?:class|className)=(?:["']\W+\s*(?:\w+)\()?["']([^'"]+)['"]/gmi;
const str = `<div id="content" class="container">
<div style="overflow:hidden;margin-top:30px">
<div style="width:300px;height:250px;float:left">
<ins class="adsbygoogle turbo" style="display:inline-block !important;width:300px;min-height:250px; display: none !important;" data-ad-client="ca-pub-1904398025977193" data-ad-slot="4723729075" data-color-link="2244BB" qgdsrhu="" hidden=""></ins>
<img src="http://static.teleman.pl/images/pixel.gif?show,753804,20160812" alt="" width="0" height="0" hidden="" style="display: none !important;">
</div>`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
答案 4 :(得分:0)
这可能不适合您,但如果您没有使用完整的正则表达式匹配,您可以这样做(假设您的示例代表您将要解析的数据) :
function hasTheClass(html_string, classname) {
//!!~ turns -1 into false, and anything else into true.
return !!~html_string.split("=")[1].split(/[\'\"]/)[1].split(" ").indexOf(classname);
}
hasTheClass("<div class='a b c d'></div>", 'b'); //returns true