如何让Regex代码中的Eval函数为iMacros做好准备



我制作了这个Regex代码,非常完美https://regex101.com/r/ctMO3W/1

const regex = /([A-Z a-z 0-9 ,;&!@#$%^&*()-`~=+ ]*)(?=">)/gu;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('([A-Z a-z 0-9 ,;&!@#$%^&*()-`~=+ ]*)(?=">)', 'gu')
const str = `<meta name="description" content="TEst text, here is the text extracted">`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}

// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}

基本上,我的代码提取了我需要的文本的一部分。介于"content=".....">

<meta name="description" content="here is the text extracted">

到目前为止还不错,但是。。我无法让它在带有Eval功能的iMacros中工作

我尝试了几个选项,不知道该怎么做了

SET newcontent EVAL("var s='{{content}}'; regex=/([A-Za-z0-9,;&!@#$%^&*()-`~=+ ]*)(?=">)/gu; s.replace(regex, '$&,');")

谢谢你在这个中的帮助

我使用(FCI):iMacros用于CR v10.1.1‘PE’、CR v105.0.5195.102(_x64)和Win10_x64。("CR"="Chrome"/"PE"="个人版")

更新:同时我找到了一个解决方案,对我来说效果很好,也许会帮助其他人,但我仍然想了解我在上面的问题上做错了什么。也许有人可以找到关于Regex代码的解决方案,以及如何在iMacros上实现它。

SET newcontent EVAL("var u='{{content}}'; var x,y,z; x=u.split('content="'); y=x[1].split('">'); z=y[0]; z;")
PROMPT {{newcontent}}

再次感谢

更新版:同时我找到了一个解决方案[…]:

SET newcontent EVAL("var u='{{content}}'; var x,y,z; x=u.split('content="'); y=x[1].split('">'); z=y[0]; z;")
PROMPT {{newcontent}}

是的,非常好!,你设法找到了我的一篇帖子(可能是在iMacros论坛的"数据提取"子论坛上,我已经在那里发布了几十次这个解决方案)
(我知道脚本/Sol来自我,我使用了一个"漂亮"的特定语法,啊啊…!:wink:)


现在回答这个Qt(问题);计划中的";没有/在看到";稍后编辑";Qt。。。(=>提供更多信息/解释…(=>不仅适用于@OP,也适用于具有类似Qt/Scenario的任何其他(未来)用户)…)

=>好吧,@OP,你有一些RegExQt,你想要一些RegEx解决方案,然后哼,我"老实说"甚至没有(真的)阅读你的Qt,就像你没有真正阅读iMacros标签Wiki(我自己写的…!(v1)),我甚至";专用的";关于CCD_ 4几乎NEVER是";最佳";Sol/使用iMacros实现,啊啊。。。!

那么,我将为您的案例/场景提供两个简单得多的解决方案,而无需使用RegEx…:

Sol 1:

基本上,我的代码提取了我需要的文本的一部分。介于"content="gt
<meta name="description" content="here is the text extracted">

>您的";这里是提取的文本";包含在双引号之间,=>可以使用简单/单个split()来获取您的数据…:

SET Item EVAL("var s='{{!EXTRACT}}'; var z=s.split('"'); z[3];")
PROMPT Extract:<SP>_{{!EXTRACT}}_<BR>Item:<SP>_{{Item}}_

"描述";也包含在双引号之间,因此z[3]split()-索引从"开始;0〃;。(如果需要的话,z[1]会输出这个"描述"字符串…)

Sol 2:

Sol 1是";最简单的";最简单,但哼…,也许不是总是完全可靠…:
对于某些"奇怪的";原因(10(+)年使用iMacros进行数据提取的经验),HTML元素的属性有时会交换顺序,因此您的<meta name="description" content="here is the text extracted">可以在刷新页面时变成<meta content="here is the text extracted" name="description">,是的,可能不是只有2个Attr,但这种情况经常发生在2个以上的Attr
(我真的没有解释为什么,也许(?)订单可以从服务器端控制/强制执行,我认为从客户端/浏览器端不可能。。。,或者仅使用在所有HTML元素上定制的一些"UserScript";"重要";对于您的iMacros脚本。。。,并且知道";"预先";所有";出乎意料的";可能发生的情况。。。我觉得很麻烦。。。,《太阳神2号》会处理好这件事,啊啊…!)

如果你";播放";在同一页面上使用iMacro;新鲜的";刷新/重新加载,因为iMacros将注入一些";像素线=蓝色";元素的HTML Def中的额外Attr;"随机";位置,所以没有真正的";保证;contentAttr将始终为列表中的第二个Attr,因此z[3]将始终正确。。。!

=>那么更可靠的将是";更具体的";在第一个split()上,并使用收件人的姓名作为split()的一部分,就像您在Qt的"稍后编辑"部分中已经发现的那样,比如:

SET !ERRORIGNORE YES
'Extracted: "<meta name="description" content="here is the text extracted">"
SET Item EVAL("var s='{{!EXTRACT}}', x,y,z; x=s.split('content="'); y=x[1].split('"'); z=y[0]; z;")
PROMPT Extract:<SP>_{{!EXTRACT}}_<BR>Item:<SP>_{{Item}}_

split()是区分大小写的,请确保您的";内容";不是";"内容";(带资本)
并且在提取为"是"的情况下需要CCD_ 18(=YES);"空";由于任何原因(=>="#EANF#"),或者x[1]将产生一些运行时错误,即使在EVAL()内部。。。

注意到我故意";仅";使用y=x[1].split('"');作为第二个split()(而不是像您使用@OP那样使用y=x[1].split('">');),=>不采用CCD_ 24Char作为假定";内容";Attr将始终是HTML摘录中的最后一个Attr,由于我解释的原因,这可能并不总是正确的。


两个Sols/Implementations都没有(专门)针对这个特定的场景/线程/SO_Qt进行测试,无论如何都没有发布URL。。。!,但是测试了许多次";在";(在v8.8.2 for FF+v8.9.7 for FF+PM("满月")+FF("火狐")的各种版本中)。。。之前在iMacros论坛上多次发布(@OP可能在"后期编辑"部分找到了Sol),这个答案和所有从头开始/记忆编写的脚本,如果";任何东西";不正确,打字或其他什么

相关内容

  • 没有找到相关文章

最新更新