Javascript 正则表达式匹配在实际页面上失败,但正则表达式测试工作得很好

标签 javascript regex

我有一个关于 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">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 时到控制台,它输出完整的源代码。

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

感谢所有帮助, 肯尼思

最佳答案

您将正则表达式放入字符串中。它不应该位于字符串内。

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;

(这假设您不需要 <=IE8 支持。如果需要,仍然有更好的方法。)

(P.S. ?{0,1} 的简写。)

关于Javascript 正则表达式匹配在实际页面上失败,但正则表达式测试工作得很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45088768/

相关文章:

php - 清理货币字符串的快速方法

javascript - 我可以在 JavaScript 中创建一个正则表达式来验证特定的数学公式 - 字母和括号,其中不应嵌套括号

javascript - 如何检查html标签是否包含类

javascript - 使用 Cordova 将表单发布到 Windows Phone 上的外部 Paypal 窗口

javascript - 如果出现 HTTP 错误 422,如何使用 fetch 获取响应正文?

javascript - 如何使用Angle 9 Service和Electronic Main Process设置IPC

javascript - 获取绘制点的半径大小(以米为单位)

python - Python 中的正则表达式

java - 如何将字符串拆分为两个考虑字符串末尾的数字(在方括号内)

javascript - 如果字符串类似于 'price 0 &euro;',则替换innerHTML