检查 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'>
)
目前,我有这个代码:
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。
我正在尝试从一个网站中提取所有 link,这些网站在实际 link 之前有“Volume”、“Volume 1”或“Volume 1:”。目前使用我的代码(查看下方),它将获得所有 link,包括图片、表情符号和其他内容。
注意:现在,它只是选择 links 并且不关注标签或任何东西,但是如果我要检查“音量”或类似内容,我还需要检查标签(例如第 1 卷 <a href='liink'>
)
目前,我有这个代码:
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。