使用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);
按预期返回BAZ
。
我最初认为这是Vugen / TruClient特定问题。然而,在睡觉之后阅读Michael Galos&#39;回答(below),我意识到这是一个通用的Javascript问题,所以我也添加了Javascript标签。
答案 0 :(得分:1)
你正在寻找的是正则表达式中的“单行”标志 遗憾的是,Javascript中不存在(regex101.com会模拟它)。
要解决此问题,您可以使用它来绕过换行符:
[\s\S]
所以在你的情况下尝试类似:
var regex = /Foo\s+Bar<br\s+\/>(.*)[\s\S]*<br \/>/i;
答案 1 :(得分:1)
感谢Michael Galos提供part of the answer。然而, 他的回答没有解决完整的问题。
我插入调试代码将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>