【问题标题】:Javascript regular expressions - exec infinite loopJavascript 正则表达式 - 执行无限循环
【发布时间】:2009-05-20 16:51:37
【问题描述】:

我正在尝试使用正则表达式获取链接文本。可能有几个链接可能与该模式匹配,我想得到最远的一个,直到第 4 个。这是我的 JS 代码:

var level=1;
while ( _match = /<a href="http:\/\/www.mysite.com\/x\/(?:.*)>(.*)<\/a>/img.exec(_html)){
    if (level < 5)  (_anchor_text=_match[1]);
    level ++;
}

问题是这段代码在 IE 上进入了无限循环(在 FF 上运行良好),尽管该模式存在。任何帮助表示赞赏。

【问题讨论】:

  • 这段代码实际上可以工作到 FF3.6,因为在每次迭代中都重用了同一个 RegExp 对象(符合 ES3)。但后来 ES3 被 ES5 取代,这改变了处理 RegExp 文字的方式:“正则表达式文字现在每次计算文字时都会返回一个唯一的对象。”在您的情况下,有效地使 g 标志无用。 es5.github.com/#E IE 再次领先于时代。

标签: javascript regex


【解决方案1】:

RegExp.exec,我相信,利用 lastIndex 属性并不断修改它以使诸如“全局组捕获”之类的事情成为可能;要让它工作,你需要有一个正则表达式。目前,您在每次迭代时都创建一个新的,所以它不会工作......

试试这个:

var level = 1;
var pattern = /<a href="http:\/\/www.mysite.com\/x\/(?:.*)>(.*)<\/a>/img;
var _match;
while ( _match = pattern.exec(_html)){
     if (level < 5)  (_anchor_text=_match[1]);
     level ++;
}

【讨论】:

  • 如果您在 while 语句中使用正则表达式文字,它实际上适用于 Firefox、Chrome、Opera 和 Safari。 IE 似乎是表现不同的那个。这并不是说 IE 的做法是错误的……
  • @Ates,我认为这种行为是由于文字正则表达式在内部被“缓存”的事实。所以当你重新使用一个时,你只是在引用同一个正则表达式对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多