我制作了这个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,你有一些RegEx
Qt,你想要一些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;"随机";位置,所以没有真正的";保证;content
Attr将始终为列表中的第二个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),这个答案和所有从头开始/记忆编写的脚本,如果";任何东西";不正确,打字或其他什么