【问题标题】:Extract a word between two words javascript提取两个单词之间的单词javascript
【发布时间】:2017-12-30 06:24:26
【问题描述】:

我这里有这样的文字

<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>

我想从&lt;span&gt;2 - 3 years old&lt;/span&gt; 行中提取&lt;span&gt;&lt;/span&gt; 之间的一个词所以我尝试了

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&lt;sup&gt;st&lt;/sup&gt;floor,它来自这个文本&lt;span&gt;1&lt;sup&gt;st&lt;/sup&gt;floor&lt;/span&gt; 知道我哪里出错了吗?

谢谢

多尼克。

【问题讨论】:

  • 不确定这个编码,但你可以尝试类似 .toString()
  • @pravid 我提到的html标签已经被视为字符串。
  • 您想要在所有跨度标签之间添加文本还是只在您指定的标签之间添加文本?​​
  • 是的,我想提取那些指定标签之间的文本。

标签: javascript imacros


【解决方案1】:

我不熟悉 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();

正在做。

split('&lt;span&gt;')

'&lt;span&gt;' 的每个实例处将字符串拆分为一个数组。现在您正在操作

[
  '<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>'
]

pop()

删除数组的最后一个元素并返回它。现在您正在操作

'1<sup>st</sup>floor</span></span>'

你已经丢失了你关心的文本。

如何解决

既然您已经表明愿意在 HTML 上执行字符串操作,那么您不妨使用正则表达式。您可以只抓取第一个 '&lt;span&gt;' 和第一个 &lt;/span&gt; 之间的文本

var c = b.match(/<span>(.*?)<\/span>/)[1];

b.matchb 中搜索文字&lt;span&gt;,然后在找到&lt;/span&gt; 之前只匹配所需的字符数。它返回一个包含两个元素的数组:正则表达式匹配的完整字符串和括号中的部分。你只关心括号中的部分,所以我们只使用数组的那个元素。

关于 HTML 和正则表达式的强制性警告:

这在一般情况下不起作用,MAY SUMMON ZALGO

HTML 过于复杂,正则表达式无法在任何情况下都可靠地处理。但是,如果您的 HTML 受到足够的限制,以至于您知道通过正则表达式发送的每个字符串的结构,那么您应该没问题。

【讨论】:

    【解决方案2】:

    如果您在浏览器环境中,那么您可以在纯 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);

    【讨论】:

      猜你喜欢
      • 2018-12-31
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2011-11-30
      相关资源
      最近更新 更多