在 Vugen TruClient 协议的对象步骤上使用 Javascript 正则表达式评估 JS

Using Javascript Regex in Evaluate JS on object step in Vugen TruClient Protocol

在使用 TruClient 协议 (Firefox) 在 Vugen 中创建脚本时,我 有一个找到对象的 Evaluate JS on object 步骤,其中 以下 object.innerHTML:

Foo Bar<br />BAZ
<br />

我需要从这篇文章中提取 BAZ 以便在其他地方使用,所以我有 以下 JS 部分的代码,使用正则表达式提取它:

var regex = /Foo\s+Bar<br\s+\/>(.*)\s*<br \/>/i;  // Shows as red in the TC JS editor, but no error icon shows, so not sure what the error may be.
var matches = [];
var match;
matches = regex.exec(object.innerHTML);
match = matches[matches.length - 1];
window.alert(match);  // For debugging purposes

但是,当我 运行 脚本时,失败并出现以下错误:

** 6: Evaluate JavaScript var regex = /Foo\s+B... alert(match); on Foo Bar
** failed - an argument is invalid: 'Code': JavaScript exception
'TypeError: matches is null' during evaluation

我已经测试了这个正则表达式 here,它有效 不出所料。

使用 webtoolkit online JS tester, 我已经成功地测试了代码的以下变体,以确保它 提取我需要的内容:

var data = "Foo Bar<br />BAZ<br />";
var regex = /Foo\s+Bar<br\s+\/>(.*)\s*<br \/>/i;
var matches = [];
var match;
matches = regex.exec(data);
match = matches[matches.length - 1];
alert(match);

这returns BAZ 符合预期。

编辑

我最初认为这是一个 Vugen/TruClient 特定问题。但是,在沉思并阅读 Michael Galos 的回答 () 之后,我意识到这是一个普遍的 Javascript 问题,因此我也向其添加了 Javascript 标签。

您要查找的是正则表达式中的 'single line' 标志。
不幸的是,Javascript 中不存在(regex101.com 会模拟它)。

要解决这个问题,您可以使用它来绕过换行符:

[\s\S]

所以在你的情况下尝试这样的事情:

var regex = /Foo\s+Bar<br\s+\/>(.*)[\s\S]*<br \/>/i; 

感谢 Michael Galos 提供 。然而, 他的回答没有解决完整的问题。

我插入了调试代码以将 object.innerHTML 写入控制台 更仔细地检查它。最后,在第 n+1 次 运行 之后,它和 观察输出,我观察到页面源是:

Foo Bar<br />BAZ
<br />

但是 Javascript 将其捕获为:

Foo Bar<br>BAZ <br>

因此,我修改了正则表达式如下:

var re = /<br\s*\/?>\s*(.*?)\s*<br\s*\/?>/i

<br /> 标签的正则表达式从 <br\s+\/> 更改为 <br\s*\/?> 匹配 <br /><br>\s* 匹配 0 个或多个空白字符,\/? 可选地匹配 / 字符。

在捕获组之前添加 \s* 修剪任何前导空格,并将 ? 添加到捕获组的末尾通过将其转换为非贪婪匹配来修剪任何尾随空格。

这现在可以成功地匹配以下任一单项的任意组合 或多行,仅返回 BAZ:

Foo Bar<br />BAZ<br />
Foo Bar<br>BAZ<br>
Foo Bar<br />     BAZ     <br />
Foo Bar<br>     BAZ     <br>