在 Vugen TruClient 协议中的对象步骤上使用 Javascript Regex 评估 JS
在使用 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 标签。
您要找的是正则表达式中的“单行”标志。
不幸的是,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>