【问题标题】:Javascript Regex - capture specific domain or links without domainJavascript Regex - 捕获特定域或没有域的链接
【发布时间】:2018-07-06 02:47:06
【问题描述】:

我有 4 种不同情况的链接具有其他属性,其中 3 种我需要匹配并仅捕获链接的文本。

简而言之 - 前3个链接需要通过href属性匹配并捕获标签之间的文本。

<a href="https://example.com/page_url" data-some-id="" data-other-prop="">Link 1</a>
<a data-href="" href="http://Go to page" data-another-id="">Link 2</a>
<a data-other="" href="/Go to page" data-val-id="">Link 3</a>
<a href="http://example123.com/page" data-props-id="">Link 4</a>

正则表达式需要匹配:

  • 包含“example.com”(链接 1 示例)或
  • 的 URL
  • 不包含域的链接(链接 2 示例),或
  • 如果没有架构,例如 http(链接 3 示例)
  • 非href 属性可以有不同的名称,因此'data-'、'style="' 和其他属性可以在href 之前或之后。
  • 需要特定于anchor (&lt;a&gt;)标签

不应捕获第 4 个链接。并且第 4 个链接将始终具有与链接 1 (example.com) 不同的域。

这 2 天我进行了很多尝试,但无法做到正确,通常是管道(正则表达式或)加上 '.*' 和否定匹配每次都会让我例如

<a.*(?:example\.com|(?!href="http?.*([\s])))+".*>(.*)<\/a>

似乎比看起来更难获得所需的匹配。

注意:这是针对字符串中的响应 HTML,匹配在应用于 DOM 之前发生。所以 jQuery 和 DOM 相关的解决方案是不可能的,抱歉。欢迎使用多个表达式进行渐进式捕获。

【问题讨论】:

  • 你是说我应该将每个锚点都压缩到href=".*" 并从那里循环匹配吗?这绝对是一个可以接受的解决方案。我想我会用这种方法回答我自己的问题。认为这可能是对 stackoverflow 的要求。
  • 这是一个字符串,如“注释”中所述。在作为响应发送之前不能使用 DOM。它基于 JS 的 API。循环和 IF 是给我的。
  • 您可以将字符串作为 DOM 元素。请参阅this SO post 了解更多信息
  • 感谢@ctwheels 的建议。对于 UI 脚本和 HTML 字符串响应,这绝对是需要牢记的。但是这个脚本也将在不支持 DOM 相关功能的服务器上使用。或者至少我在之前的尝试中遇到了语法问题。

标签: javascript regex


【解决方案1】:
<a ?.*? href="(?:(?:.*?example\.com.*?)|(?:[^\.]*?))".*?>(.*?)<\/a>

这似乎适用于您给出的示例。它类似于您在尝试中编写的内容,但使用惰性量词来防止匹配不需要的内容。

Example in action and full explanation.

【讨论】:

  • 效果很好。谢谢!我做了一个小改动来获取文本捕获组:&lt;a ?.*? href="(?:(?:.*?example\.com.*?)|(?:[^\.]*?))".*?&gt;(.*?)&lt;\/a&gt;
  • 哦,抱歉,我误读了您帖子的那部分内容。我以为您希望返回 URL,而不是文本。答案已更新。
  • 不用担心。我只是想让比赛要求正确。感谢您的编辑。
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多