2016-02-02 19 views
0

当使用TruClient协议(火狐)在VuGen创建脚本,我 具有Evaluate JS on object步骤,用于查找一个对象,与 以下object.innerHTML使用JavaScript正则表达式中评估JS在VUGEN TruClient协议对象步骤

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的回答(below)后,我意识到这是一个通用的JavaScript问题,所以我也为此添加了Javascript标记。

回答

1

谢谢迈克尔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> 
1

你要找的是正则表达式中的'单线'标志。
不幸的是,在JavaScript中不存在(regex101.com将尽可能模拟它)。

要解决它,你可以用它来绕过换行符:

[\s\S] 

所以你的情况你可以试试:

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

我想到了一夜,你的回答证实了这一点,所以我第一次做这些确切的变化今天早上没有运气的事情。我仍然收到相同的错误。我也试过以下内容:'var re =/Foo \ s + Bar ([\ s \ S] *)
/i'应该匹配ANY字符,包括字母数字,空格和换行符,是否正确?无论如何,这也失败了,我仍然得到错误。 –

+1

我解决了这个问题,并会发布我的答案。你的帖子确定了问题的一部分,但不是全部。 –