我有一个非常具体的问题,关于Javascript中的正则表达式匹配。我正在尝试匹配一段源代码,更具体地说是这里的一部分:
<TD WIDTH=100% ALIGN=right><a href="http://forum.tibia.com/forum/?action=main&sectionid=2">World Boards</a> | <a href="http://forum.tibia.com/forum/?action=board&boardid=106121">Olympa - Trade</a> | <b>Bump when Yasir...</b></TD>
我想要匹配的部分是boardid=106121">Olympa - Trade</a>
,我实际需要的部分是“Olympa”。所以我使用以下JS代码行来获得匹配并返回“Olympa”:
var world = document.documentElement.innerHTML.match('/boardid=[0-9]+">([A-Z][a-z]+)( - Trade){0,1}<\/a>/i')[1];
( - Trade)
部分在我的问题中是可选的,因此正则表达式中的{0,1}
。
也没有更简单的方法来缩小代码范围,例如getElementsByTagName,因此搜索完整的源代码是我唯一的选择。
现在这是有趣的事情。我使用了两个在线正则表达式匹配器(其中一个专门用于JS-regex)来测试我的正则表达式对完整的源代码。两次,它都有一场比赛并且完全按照原样返回“Olympa”。但是,当Chrome在实际页面上包含脚本时,会出现以下错误:
Error in event handler for 'undefined': Cannot read property '1' of null TypeError: Cannot read property '1' of null
显然,我的行的第一部分返回“null”,因为它找不到匹配项,并且取“null”的[1]不起作用。
我认为我可能没有对源代码进行匹配,但是当我让脚本输出document.documentElement.innerHTML
到控制台时,它会输出完整的源代码。
我认为没有理由为什么这个正则表达式失败了,所以我必须忽略一些非常愚蠢的东西。有没有其他人看到这个问题?
所有帮助表示赞赏, 肯尼斯
答案 0 :(得分:7)
您将正则表达式放在字符串中。它不应该在字符串中。
var world = document.documentElement.innerHTML.match(/boardid=[0-9]+">([A-Z][a-z]+)( - Trade){0,1}<\/a>/i)[1];
另一件事 - 看起来你有一个文档对象,在这种情况下,所有这些HTML都已经为你解析了,你可以利用它而不是重新发明一个脆弱的轮子。
var element = document.querySelector('a[href*="boardid="]');
var world = element.textContent;
(这假设您不需要&lt; = IE8支持。但如果您这样做,仍然有更好的方法。)
(P.S。?
是{0,1}
的简写。)