【问题标题】:Javascript RegEx get class nameJavascript RegEx 获取类名
【发布时间】:2017-02-10 05:58:08
【问题描述】:

* 我已经搜索了堆栈溢出并尝试了所有类似问题的答案 *

我正在编写一个节点脚本:

  1. 扫描目录以查找 html 文件
  2. 将文件内容读入字符串
  3. 在字符串中搜索 id 或类名

我正在使用正则表达式来查找 id 或类名。我在搜索 id 时可以获得匹配,但在搜索类名时不能。

这是我的示例代码:

https://jsbin.com/bayuquzulu/edit?js,console

为简单起见,我将html放入变量中,省略了文件读取部分。

var html = '<section class="mb-4" id="button-test">'+
        '<button type="button" class="btn btn-primary">Primary</button>'+
        '<button type="button" class="btn btn-secondary">Secondary</button>'+
        '<button type="button" class="btn btn-success">Success</button>'+
        '</section>';

var scan = function(content) {

    var props = ['btn-primary', 'button-test'], res = {};

    for (var i = 0; i < props.length; i++) {
        var prop = props[i];

        var exps = [
            {key: '#', exp: new RegExp("<*.* id=([\"]|')\\s*"+prop+"\\s*([\"]|').*>", "gi")},
            {key: 'data-comp=', exp: new RegExp("<*.* data-dna=([\"]|')\\s*"+prop+"\\s*([\"]|').*>", "gi")},
            {key: '.', exp: new RegExp("<*.* class=([\"]|')*."+prop+".*([\"]|').*>", "gi")}
        ];

        for (var e = 0; e < exps.length; e++) {
            var item = exps[e];
            var key = item.key;
            var exp = item.exp;
            var match = content.match(exp);

            key += prop;

            if (match) {

                if (!res[key]) { res[key] = []; }

                res[key].push(match[0]);

            }
        }
    }

    return res;
}

console.log(scan(html));

【问题讨论】:

  • 关于该主题的解决方案都不适合我。
  • 您能否添加一些关于到底是什么失败的细节?预期的输出应该是什么样的?它是什么样的?你的代码在什么时候失败了?`(class|id)="(.*?)" 呢?
  • 重新检查你的正则表达式,它们看起来很错误,部分太复杂了
  • 如果您接受使用库,我建议您先使用解析器,例如 github.com/fb55/htmlparser2 。将 HTML 解析为树后,遍历树并找出所有类名是一个简单的问题。

标签: javascript regex node.js


【解决方案1】:

我认为这可能是答案:

const data = `<section class="mb-4" id="button-test">
    <button type="button" class="btn btn-primary">Primary</button>
    <button type="button" class="btn btn-secondary">
        Secondary
    </button>
    <button type="button" class="btn btn-success">
        Success
    </button>
</section>`

const elements = []

const findTag = /<[^\/].*?>/g
let element
while(element = findTag.exec(data)){
  element = element[0]
  const id = (element.match(/id="(.*?)"/i) || [, ""])[1]
  const classes = (element.match(/class="(.*?)"/i) || [,""])[1].split(' ')
  
  element = {}
  element["id"] = id
  element["class"] = classes
  elements.push(element)
}
console.log("All elements")
console.log(elements)

// You can now also filter elements
console.log("All elements having btn class")    
console.log(elements.filter(element => element.class.indexOf("btn") != -1))

【讨论】:

  • 啊,我没想到先创建一个标签解析器。谢谢大佬!
  • 解决一个大问题最好的办法就是把它分成几个小问题:D
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多