开发者问题收集

在 Vugen TruClient 协议中的对象步骤上使用 Javascript Regex 评估 JS

2016-02-02
2551

在使用 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

我已经在 此处 测试了这个正则表达式,并且它的工作方式如下预期。

使用 webtoolkit 在线 JS 测试器 , 我已成功测试了代码中的以下变体,以确保它 提取我需要的内容:

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);

这将按预期返回 BAZ

编辑

我最初以为这是一个 Vugen/TruClient 特定问题。然而,在仔细考虑并阅读了 Michael Galos 的回答( 以下 )后,我意识到这是一个通用的 Javascript 问题,所以我也向其中添加了 Javascript 标签。

2个回答

您要找的是正则表达式中的“单行”标志。
不幸的是,Javascript 中不存在该标志(不过 regex101.com 会模拟该标志)。

要解决这个问题,您可以使用以下方法绕过换行符:

[\s\S]

因此,对于您的情况,请尝试以下方法:

var regex = /Foo\s+Bar<br\s+\/>(.*)[\s\S]*<br \/>/i; 
Michael Galos
2016-02-03

感谢 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>
Deacon
2016-02-03