0

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

BAZ将按预期返回。

编辑

我最初认为这是 Vugen/TruClient 特定的问题。然而,睡在上面并阅读 Michael Galos 的回答(如下)之后,我意识到这是一个通用的 Javascript 问题,所以我也添加了 Javascript 标记。

4

2 回答 2

1

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

要解决它,您可以使用它来解决换行符:

[\s\S]

因此,在您的情况下,请尝试以下操作:

var regex = /Foo\s+Bar<br\s+\/>(.*)[\s\S]*<br \/>/i; 
于 2016-02-03T13:47:25.233 回答
1

感谢 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>。匹配 0个\s*或多个空白字符,并且\/?可选地匹配/字符。

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

现在,这成功匹配单行或多行上的以下任意组合,仅返回BAZ

Foo Bar<br />BAZ<br />
Foo Bar<br>BAZ<br>
Foo Bar<br />     BAZ     <br />
Foo Bar<br>     BAZ     <br>
于 2016-02-03T16:48:45.280 回答