检查 link 之前是否有特定文本(正则表达式)

Checking if before the link there is a specific text (regex)

我正在尝试从一个网站中提取所有 link,这些网站在实际 link 之前有“Volume”、“Volume 1”或“Volume 1:”。目前使用我的代码(查看下方),它将获得所有 link,包括图片、表情符号和其他内容。

注意:现在,它只是选择 links 并且不关注标签或任何东西,但是如果我要检查“音量”或类似内容,我还需要检查标签(例如第 1 卷 <a href='liink'>

可用于测试的页面:0, 1, 2

目前,我有这个代码:

const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)/g;

document.querySelector(".inner").outerHTML.match(urlRegex);

它选择 inner 元素并将其所有 HTML 放入字符串中。然后它将尝试解析字符串中的所有 link。但它也包括除了实际数据(卷)之外我不想要的所有图片和其他东西。

如果你对我想要的东西感到困惑,那么例如,我们有这个:

<br>volume 1 <a ... /a><br>
<br>image <a ... /a><br>

我只想获得第 1 卷 link。有什么办法可以预防吗?

您需要在正面前瞻和正面回顾之间放置您想要的匹配项:

let html = `<br>volume 1 <a href="https://www.google.com" /a><br>\n<br>image <a href="https://www.facebook.com" /a><br>`
let links = html.match(/(?<=volume.*?href=\").*?(?=\")/ig);
console.log(links);

表达式解释:

  • (?<=...) 是一个积极的回顾。它断言它后面的内容之前是它里面的内容(...,在上面的表达式中是 volume.*?href=\")。
  • volume 按字面意思匹配单词“volume”。请注意,由于最后的 i 标志,此处所有匹配项都是 case-insensitive。
  • .*? 匹配任意字符零次或多次,不贪心。因此它将匹配任何字符,直到它到达下一个表达式。
  • href=\" 按字面意思匹配 href="
  • .*? 再次匹配零到无限次之间的任何字符 non-greedily.
  • (?=\") 是一个积极的前瞻。它断言在它之前出现的是 ".

您可以在这里找到更好的解释:https://regex101.com/r/SOB1Gi/1

简而言之,这个表达式匹配出现在单词 volume 之后的任何 link。