【问题标题】:Javascript regex match fails on actual page, but regex tests work just fineJavascript 正则表达式匹配在实际页面上失败,但正则表达式测试工作得很好
【发布时间】:2013-01-21 15:29:13
【问题描述】:

我有一个关于 Javascript 中的正则表达式匹配的非常具体的问题。我正在尝试匹配一段源代码,更具体地说是这里的一部分:

<TD WIDTH=100% ALIGN=right><a href="http://forum.tibia.com/forum/?action=main&amp;sectionid=2">World Boards</a> | <a href="http://forum.tibia.com/forum/?action=board&amp;boardid=106121">Olympa - Trade</a> | <b>Bump when Yasir...</b></TD>

我要匹配的部分是boardid=106121"&gt;Olympa - Trade&lt;/a&gt;,我真正需要的部分是“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 输出到控制台时,它会输出完整的源代码。

我看不出这个正则表达式失败的原因,所以我一定忽略了一些非常愚蠢的事情。其他人看到问题了吗?

感谢所有帮助, 肯尼斯

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您将正则表达式放在字符串中。它不应该在字符串中。

    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;
    

    (这假设您不需要

    (附注:?{0,1} 的简写。)

    【讨论】:

    • 哦,当然。我现在觉得好傻!它可以在不使用“exec”的情况下正常工作。我不太明白你想要做出的改变。我会尽快将您的答案标记为正确答案(还有 2 分钟的等待时间)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多