提取两个词之间的一个词 javascript
Extract a word between two words javascript
我这里有这样一段文字
<div class="listing-details" style="outline: 1px solid blue;">
<meta itemprop="startDate" content="2016-04-11T18:30:00.000Z">
<span class="keypoint" title="old" style="outline: 1px solid blue;">
<span>2 - 3 years old</span></span>
<span class="keypoint" title="Bathrooms" style="outline: 1px solid blue;">
<span>1 Bathrooms</span></span>
<span class="keypoint" title="floor" style="outline: 1px solid blue;">
<span>1<sup>st</sup>floor</span></span>
</div>
我想从 <span>2 - 3 years old</span>
行中提取 <span>
和 </span>
之间的一个词 所以为此我尝试了
TAG POS=1 TYPE=div ATTR=class:listing-details EXTRACT=HTM
SET txt1 {{!EXTRACT}}
SET a EVAL("var b='{{txt1}}';var c=b.split('<span>').pop().split('</span>').shift();c;")
PROMPT {{a}}
但这给了我这个输出 1<sup>st</sup>floor
这是来自这个文本 <span>1<sup>st</sup>floor</span>
知道我哪里出错了吗?
谢谢
多姆尼克
我不熟悉 iMacros,但我假设当您点击 EVAL
时,您要做的第一件事就是分配
'<meta ...><span class="keypoint" ...><span>2 - 3 years old</span></span><span class="keypoint" ...><span>1 Bathrooms</span></span><span class="keypoint" ...><span>1<sup>st</sup>floor</span></span>'
到b
。既然如此,让我们来看看什么
b.split('<span>').pop().split('</span>').shift();
正在做。
在 '<span>'
的每个实例处将字符串拆分为一个数组。现在您在
上进行手术
[
'<meta ...><span class="keypoint" ...>',
'2 - 3 years old</span></span><span class="keypoint" ...>',
'1 Bathrooms</span></span><span class="keypoint" ...>',
'1<sup>st</sup>floor</span></span>'
]
删除数组的最后一个元素并returns它。现在您在
上进行手术
'1<sup>st</sup>floor</span></span>'
而且您丢失了您关心的文本。
如何修复
既然您已经表现出对 HTML 执行字符串操作的意愿,您不妨使用正则表达式。您可以使用
仅获取第一个 '<span>'
和第一个 </span>
之间的文本
var c = b.match(/<span>(.*?)<\/span>/)[1];
b.match
在 b
中搜索文字 <span>
,然后在找到 </span>
之前只匹配所需数量的字符。它 returns 一个包含两个元素的数组:正则表达式匹配的完整字符串和括号中的部分。您只关心括号中的部分,所以我们只使用数组的那个元素。
关于 HTML 和正则表达式的强制性警告:
THIS WILL NOT WORK IN THE GENERAL CASE AND MAY SUMMON ZALGO
HTML 太复杂了,正则表达式无法在每种情况下可靠地处理。但是,如果您的 HTML 受到足够的限制,以至于您知道通过正则表达式发送的每个字符串的结构,那么您应该没问题。
如果您在浏览器环境中,那么您可以在纯 javascript 中执行此操作。
let str="<div class=\"listing-details\" style=\"outline: 1px solid blue;\"><meta itemprop=\"startDate\" content=\"2016-04-11T18:30:00.000Z\"><span class=\"keypoint\" title=\"old\" style=\"outline: 1px solid blue;\"><span>2 - 3 years old</span></span><span class=\"keypoint\" title=\"Bathrooms\" style=\"outline: 1px solid blue;\"><span>1 Bathrooms</span></span><span class=\"keypoint\" title=\"floor\" style=\"outline: 1px solid blue;\"><span>1<sup>st</sup>floor</span></span></div>";
let myDiv=document.createElement('div');
myDiv.innerHTML=str;
let spans=myDiv.querySelectorAll('.keypoint>span');
let arr=[];
spans.forEach(span=>{arr.push(span.innerText)});
console.log(arr);
我这里有这样一段文字
<div class="listing-details" style="outline: 1px solid blue;">
<meta itemprop="startDate" content="2016-04-11T18:30:00.000Z">
<span class="keypoint" title="old" style="outline: 1px solid blue;">
<span>2 - 3 years old</span></span>
<span class="keypoint" title="Bathrooms" style="outline: 1px solid blue;">
<span>1 Bathrooms</span></span>
<span class="keypoint" title="floor" style="outline: 1px solid blue;">
<span>1<sup>st</sup>floor</span></span>
</div>
我想从 <span>2 - 3 years old</span>
行中提取 <span>
和 </span>
之间的一个词 所以为此我尝试了
TAG POS=1 TYPE=div ATTR=class:listing-details EXTRACT=HTM
SET txt1 {{!EXTRACT}}
SET a EVAL("var b='{{txt1}}';var c=b.split('<span>').pop().split('</span>').shift();c;")
PROMPT {{a}}
但这给了我这个输出 1<sup>st</sup>floor
这是来自这个文本 <span>1<sup>st</sup>floor</span>
知道我哪里出错了吗?
谢谢
多姆尼克
我不熟悉 iMacros,但我假设当您点击 EVAL
时,您要做的第一件事就是分配
'<meta ...><span class="keypoint" ...><span>2 - 3 years old</span></span><span class="keypoint" ...><span>1 Bathrooms</span></span><span class="keypoint" ...><span>1<sup>st</sup>floor</span></span>'
到b
。既然如此,让我们来看看什么
b.split('<span>').pop().split('</span>').shift();
正在做。
在 '<span>'
的每个实例处将字符串拆分为一个数组。现在您在
[
'<meta ...><span class="keypoint" ...>',
'2 - 3 years old</span></span><span class="keypoint" ...>',
'1 Bathrooms</span></span><span class="keypoint" ...>',
'1<sup>st</sup>floor</span></span>'
]
删除数组的最后一个元素并returns它。现在您在
上进行手术'1<sup>st</sup>floor</span></span>'
而且您丢失了您关心的文本。
如何修复
既然您已经表现出对 HTML 执行字符串操作的意愿,您不妨使用正则表达式。您可以使用
仅获取第一个'<span>'
和第一个 </span>
之间的文本
var c = b.match(/<span>(.*?)<\/span>/)[1];
b.match
在 b
中搜索文字 <span>
,然后在找到 </span>
之前只匹配所需数量的字符。它 returns 一个包含两个元素的数组:正则表达式匹配的完整字符串和括号中的部分。您只关心括号中的部分,所以我们只使用数组的那个元素。
关于 HTML 和正则表达式的强制性警告:
THIS WILL NOT WORK IN THE GENERAL CASE AND MAY SUMMON ZALGO
HTML 太复杂了,正则表达式无法在每种情况下可靠地处理。但是,如果您的 HTML 受到足够的限制,以至于您知道通过正则表达式发送的每个字符串的结构,那么您应该没问题。
如果您在浏览器环境中,那么您可以在纯 javascript 中执行此操作。
let str="<div class=\"listing-details\" style=\"outline: 1px solid blue;\"><meta itemprop=\"startDate\" content=\"2016-04-11T18:30:00.000Z\"><span class=\"keypoint\" title=\"old\" style=\"outline: 1px solid blue;\"><span>2 - 3 years old</span></span><span class=\"keypoint\" title=\"Bathrooms\" style=\"outline: 1px solid blue;\"><span>1 Bathrooms</span></span><span class=\"keypoint\" title=\"floor\" style=\"outline: 1px solid blue;\"><span>1<sup>st</sup>floor</span></span></div>";
let myDiv=document.createElement('div');
myDiv.innerHTML=str;
let spans=myDiv.querySelectorAll('.keypoint>span');
let arr=[];
spans.forEach(span=>{arr.push(span.innerText)});
console.log(arr);