从HTML文本中提取所有CSS类
extract all css classes from html text
我有一个html作为文本字符串,例如
var html="bla<p class=" c1 c2">blabla<button></button><div id="bla" class="c1 c3 "></div>"
我想把所有唯一的类提取到一个数组中。所以我想要这样的结果:
classes=['c1','c2','c3']
我试图使用regexp,但无法弄清楚如何分组和收集所有单独的类,以及如何然后提取唯一的到数组中?
注意-我需要一个纯javascript(没有jquery)的解决方案,请!
你可以这样做:
var html = "bla<p class='c1 c2'>blabla<button></button><div id='bla' class='c1 c3'></div>";
var classes = []; // empty array
html.replace(/class=['"][^'"]+/g, function(m){ // https://regex101.com/r/jD0wX1/1
classes = classes.concat(m.match(/[^'"]+$/)[0].split(' ')); // https://regex101.com/r/jD0wX1/2
}); // take all classes
classes = classes.filter(function(item, pos) {
return classes.indexOf(item) == pos;
}); // return unique classes
console.log(classes); // Run code snippet -> then press f12 to see the array
希望能有所帮助。
这不是最漂亮的解决方案,但这里。
首先将字符串分成几部分
var parts = html.split(/class=/);
var classes = [];
for (var i = 0; i < parts.length-1; i++) {
classes[i] = parts[i+1].split(/''>/)[0].replace(/''/).trim();
}
我为你创建了一个regex,玩它,它为javascript和php regex服务,希望它有帮助:https://regex101.com/r/hR5mM0/4,只是使用它与javascript:
var re = /class="(.*?)"/g;
var str = 'bla<p class="c1 c2">blabla<button></button><div id="bla" class="c1 c3"></div>';
var m;
var arr = [];
while ((m = re.exec(str)) !== null) {
arr = arr.concat(arr, m[1].split(" ") );
}
arr = arr.filter(function(item, pos, self) {
return self.indexOf(item) == pos;
});
console.log(arr); //["c1", "c2", "c3"]
这里是小提琴:https://jsfiddle.net/jnyym0ye/7/
这绝不是一个漂亮的解决方案,但使用RegEx的另一种选择是创建一个元素。将HTML作为内容提供给它,然后对它运行一个查询选择器,查找任何带有类的内容。然后,您可以遍历填充只有唯一类的数组的所有元素。
(function(){
var html="bla<p class='c1 c2'>blabla<button></button><div id='bla' class='c1 c3 '></div>",
div = document.createElement('div'),
classed,
classes = [],
newClasses;
div.innerHTML = html;
classed = div.querySelectorAll('[class]');
for(var i=0; i < classed.length; i++) {
newClasses = classed[i].className.split(' ');
for (var c = 0; c < newClasses.length; c++) {
if (newClasses[c].trim() !== '' && classes.indexOf(newClasses[c]) === -1) { classes.push(newClasses[c]);
}
}
}
}())
/* classes == ['c1', 'c2', 'c3'] */
正如我所否认的那样,它并不漂亮,但它只是我想到的另一种路径。
或者在Java中,如果它有助于你的事业:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.HashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//reads in file passed as argument, or called index.html & prints out a list of all classes with dupes removed.
public class CSSApp {
public static void main(String[] args) throws Exception{
byte[] encoded = Files.readAllBytes(Paths.get( (args.length > 0) ? args[0] : "index.html"));
String html = new String(encoded, "UTF-8");
HashSet<String> noDupes = new HashSet<String>();
Matcher m = Pattern.compile("class=[''"](.*?)[''"]")
.matcher(html);
while (m.find()) {
String [] occurences = m.group().replaceAll("class=", "").replaceAll("'"", "").replaceAll("'", "").split("([ ]){1,}");
for(int i = 0; i < occurences.length; i++) {
noDupes.add(occurences[i]);
}
}
String [] classes = noDupes.toArray(new String[] {});
Arrays.sort(classes);
for(int i = 0; i < classes.length; i++) {
System.out.println(classes[i]);
}
}
}
Try
function extract(html) {
let m= html.match(/class=(".*?"|'.*?')/g)||[]; // class list
let c= m.map(c=>c.replace(/class=("|')'s*/,'').slice(0,-1)); // only names
return [...new Set(c.map(x=>x.split` `).flat())]; // del duplicates
}
// TEST
function print(classList) {
output.value = extract(classList).reduce((a,c) => a+=`.${c} {'n}'n'n`, '')
}
<textarea id="inp" cols="70" rows="4" placeholder="Paste html"></textarea>
<br><button onclick="print(inp.value)">Extract CSS!</button><br><br>
<textarea id="output" cols="70" rows="4"></textarea>
基于John Diaz上面的答案,我的解决方案是:
var str = 'bla<p class="c1 c2">blabla<button></button><div id="bla" class=" c1 c3 "></div>';
var classes=getHTMLclasses(str);
console.log(classes);
function getHTMLclasses(html) {
// get all unique css classes in html into dict
var classRegexp = /class=['"](.*?)['"]/g;
var dict = [];
var m;
while ((m = classRegexp.exec(html)))
{
var classes=m[1].replace(/'s+/g, ' ').trim();
classes.split(" ").forEach(function(item) {
dict[item]=true;
});
}
// convert dict to arr
var arr=[];
for (var key in dict) arr.push(key);
return arr;
}
看到jsfiddle
相关文章:
- CSS-如何定位内容数据标题
- 窗口大小html css
- 如果文本字段为空,则使用JavaScript应用CSS样式
- 动画.CSS重播
- 有没有一种方法可以防止img get请求使用css或js发生
- JavaScript无法提取引号css属性
- Galleria致命错误:无法从CSS/Multiple Galleria和Display中提取舞台高度:none;
- 提取concernet html的所有内联css
- 如何使用正则表达式从字符串中提取CSS规则
- 将html文档中的css样式提取到外部css文件中
- 内联css提取
- 如何在dom-node上获取和提取匹配的css规则
- 从HTML文本中提取所有CSS类
- 提取字段值并将其应用为CSS颜色值
- 如何解析和提取CSS选择器作为字符串
- 从JavaScript的css规则中提取RGB和RGBA
- 提取所有CSS类和ID's在给定的HTML块中
- 将HTML中的CSS提取/解码为Python
- 如何从 CSS 选择器中提取类名
- 使用 getElementById 提取 CSS 数据