使用Javascript正则表达式获取字符串中的所有事件

使用Javascript正则表达式获取字符串中的所有事件,javascript,regex,prototype,Javascript,Regex,Prototype,首先,我不是JavaScript专家,事实上我是新手 我了解PHP,并且有一些函数可以获取正则表达式模式的所有出现情况preg\u match()和preg\u match\u all() 在互联网上,我找到了许多资源,展示了如何在一个字符串中获取所有事件。但当我做几场正则表达式比赛时,我觉得很难看 这是我在互联网上发现的: var fileList = [] var matches while ((matches = /<item id="(.*?)" href="(.*?)" medi

首先,我不是JavaScript专家,事实上我是新手

我了解PHP,并且有一些函数可以获取正则表达式模式的所有出现情况
preg\u match()
preg\u match\u all()

在互联网上,我找到了许多资源,展示了如何在一个字符串中获取所有事件。但当我做几场正则表达式比赛时,我觉得很难看

这是我在互联网上发现的:

var fileList = []
var matches
while ((matches = /<item id="(.*?)" href="(.*?)" media-type="(?:.*?)"\/>/g.exec(data)) !== null) {
    fileList.push({id: matches[1], file: matches[2]})
}

fileOrder = []
while ((matches = /<itemref idref="(.*?)"\/>/g.exec(data)) !== null) {
    fileOrder.push({id: matches[1]})
}
var fileList=[]
变量匹配
while((匹配=//g.exec(数据))!==null){
push({id:matches[1],file:matches[2]})
}
fileOrder=[]
while((匹配=//g.exec(数据))!==null){
fileOrder.push({id:matches[1]})
}

除了这段代码,还有其他更优雅的方法吗?

我想出了用字符串创建方法的主意

我写了一个
String.prototype
对我来说很简单:

String.prototype.getMatches = function(regex, callback) {
  var matches = []
  var match
  while ((match = regex.exec(this)) !== null) {
    if (callback)
      matches.push(callback(match))
    else
      matches.push(match)
  }

  return matches
}
现在我可以用更优雅的方式得到所有的火柴了。它还类似于PHP的
preg\u match\u all()
函数

var fileList = data.getMatches(/<item id="(.*?)" href="(.*?)" media-type="(?:.*?)"\/>/g, function(matches) {
    return {id: matches[1], file: matches[2]}
})

var fileOrder = data.getMatches(/<itemref idref="(.*?)"\/>/g, function(matches) {
    return matches[1]
})
var fileList=data.getMatches(//g,函数(matches){
返回{id:matches[1],file:matches[2]}
})
var fileOrder=data.getMatches(//g,函数(matches){
返回匹配项[1]
})

我希望这也能对您有所帮助。

在html上使用正则表达式通常被认为是一个坏主意,因为正则表达式没有足够的能力来可靠地匹配
a^n b^n
任意嵌套的事件,例如平衡排列或html/XML打开/关闭标记。在JavaScript中,从DOM中获取数据也非常容易,而无需将其视为字符串,这就是DOM的用途。例如:

let mapOfIDsToFiles = Array.from(document.querySelectorAll('item'))
  .reduce((obj, item) => {
    obj[item.id] = item.href;
    return obj;
  }, {});
这具有更快、更简单和更健壮的附加优势。DOM访问速度很慢,但无论如何都要访问DOM以获取运行正则表达式的HTML

修改内置原型(如
String.prototype
)通常被认为是一个坏主意,因为它可能会导致定义相同函数但不同的第三方代码随机中断,或者如果JavaScript标准更新为包含该函数但其工作方式不同

使现代化 如果数据已经是字符串,则可以轻松地将其转换为DOM元素,而不会影响页面:

let elem = document.createElement('div')
div.innerHTML = data;
div.querySelectorAll('item'); // gives you all the item elements
只要不将其附加到文档中,它就只是内存中的一个JavaScript对象

更新2 是的,这也适用于XML,但将其转换为DOM稍微复杂一些:

// define the function differently if IE, both do the same thing
let parseXML = (typeof window.DOMParser != null && typeof window.XMLDocument != null) ?
  xml => ( new window.DOMParser() ).parseFromString(xml, 'text/xml') :
  xml => {
    let xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');
    xmlDoc.async = "false";
    xmlDoc.loadXML(xml);
    return xmlDoc;
  };

let xmlDoc = parseXML(data).documentElement;

let items = Array.from(xmlDoc.querySelectorAll('item'));
请注意,如果解析失败(即您的文档格式不正确),则需要检查错误文档,如下所示:

// check for error document
(() => {
  let firstTag = xmlDoc.firstChild.firstChild;
  if (firstTag && firstTag.tagName === 'parsererror') {
    let message = firstTag.children[1].textContent;
    throw new Error(message);
  }
})();

你的问题是?哦。我想我做错了,我试着向像我这样的新手分享知识,如果他们需要这样的东西。我应该回答我的问题吗?这是一个问答网站,不是论坛。除非您有关于编程的特定问题,否则应该删除此项。你甚至可以通过说“我在这里使用的方法有什么问题?”来把这变成一个问题,尽管这会使它比在这里更适合。是的,这不是一个论坛,但我看到了一些帖子,它们不提问,而是展示了它是如何做到的。你是说他们也做错了吗?是的,他们做错了。完全错了。实际上不是问题的“问题”是封闭的,除非它们具有历史意义(即有数千个或数百万个入站链接)然后,它们被一个注释锁定,解释说尽管由于这个原因它们被保留了下来,但它们并不适合我们的问答格式。但是
数据
变量没有加载到DOM中。它来自一个文件。如果您知道如何将字符串转换为单独的DOM而不触及页面的实际DOM,那就太好了。如果字符串实际上是XML文档,这也行吗?最后一件事。我使用node(实际上是electron)解析这个XML。那么,
DOMParser
是适合它的对象吗?@GokhanOzturk-nope,node没有内置这些功能。但有了node,实际上可以说有更好的解决方案,比如:。我曾经用它写过一个iTunes播放列表转换器。