在大字符串中搜索子字符串(更改每个循环迭代)

时间:2019-11-29 08:24:40

标签: javascript html

我正在遍历HTML元素,并从自定义数据集中提取以下字符串。

"<div class="item"><span class="label">Test:</span><span>server</span></div><div class="item"><span <span class="label">Assigned to:</span><span>name(position) </span></div><div"

我需要做的是提取关键字name。问题是,名称本质上是一个变量-每次字符串出现在循环中时,总会有句子Assigned to:</span><span>name(position),只有{{name}}会更改,但显示为字符串。如何搜索和提取名称?我要寻找Assigned to:</span><span>并随后复制单词吗?我该怎么办?

谢谢!

3 个答案:

答案 0 :(得分:1)

虽然不知道问题的全部范围,但是很难说-但是这可能是从DOM直接获取所需内容的好选择,而不是手动过滤字符串。与使用正则表达式相比,在许多情况下,这往往更健壮和可维护(无论如何都很棒)。

Document.querySelectorAll()Adjacent sibling combinator在这里可能是您的朋友:

// fetch all spans which are neighbour to a span with the class 'label'
const targetSpans = document.querySelectorAll('span.label + span');
// Iterate the items, outputting each of their contents
targetSpans.forEach(target => {
  console.log(target.textContent);
});

提供了您的代码段,这还将匹配包含“ server”作为textContent的范围。但是,如果这是您唯一的“误报”,则将其过滤掉应该很容易。

就像我说的那样,利用所提供的信息很难说哪种解决方案可以最好地解决您的实际问题。但是DOM解析也可能是一种选择。

答案 1 :(得分:0)

您最初的想法是正确的-您需要在每个字符串中搜索将围绕您的姓名的常量,然后从其中提取姓名。

从您的问题来看,您的名字看起来像这样:

<span class="label">Assigned to:</span><span>name(position) </span>

我要这样做的方法是使用regular expression-我发现站点https://regex101.com/对于使它们正确无误非常有用。在其中粘贴整个字符串,然后构建表达式并确保要匹配的部分。

在这种情况下,您想要一个这样的正则表达式:

const regex = /<span class="label">Assigned to:<\/span><span>(.*?)<\/span>/

您可以在此查看Regex 101的外观(注意捕获的组): screenshot of regex 101 showing matched label

该站点还解释了正则表达式各部分的功能。在这种情况下,它几乎是一个纯文本匹配项(\/部分只是在正则表达式中转义/字符),唯一有趣的部分是我们使用捕获匹配中的所有内容惰性量词,这意味着它捕获的内容不会超出需要的数量。如果我们不使用惰性量词(?),它将匹配整个字符串中第一个跨度之后的一切,直到最后一个封闭跨度,因为。字符匹配所有内容,因此请小心这一点(尝试在测试字符串上添加额外的</span>来了解我的意思。

我将留给您阅读有关如何在javascript中实现正则表达式匹配的信息。

答案 2 :(得分:0)

使用正则表达式通常可以更好地完成复杂的搜索。这似乎可以满足您的要求:

pthread_mutex_destroy

将字符串分配给“ subj”,将正则表达式搜索模式分配给“ re”,然后将doing和exec的结果分配给“ z”。

正则表达式本身:以斜杠开头,其字面值加在名称字段前。...然后是魔术。

括号是一个“捕获组”;无论匹配什么内容,都将分别返回。 “ ^”是“ not”,“ \”是转义“(”是保留字符,“ *”表示“查找尽可能多的内容。”

因此,他们告诉它查找前缀字符串,然后返回每个字符,直到我们点击“(”。

然后进行退货处理。 “ exec”返回[0]中的整个匹配项,而不是我们想要的。第一个(仅在这种情况下)捕获组位于[1]中。