匹配伪元素内容的正则表达式示例 属性

Regex example to match pseudo element's content property

我正在尝试解析伪 select 或 javascript 中的内容。 Html内容可以

content: counter(item)" " attr(data) "" counter(item1,decimal) url('test.jpeg') "hi" attr(xyz);

为了解析此内容,我使用以下正则表达式(从互联网复制的匹配括号的逻辑)

 counter\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)

这个select所有的计数器都带有"("但是计数器不能有嵌套的括号(据我所知,如果我错了请纠正我) .同样的正则表达式我也在使用 select 其他内容。

  1. 属性:attr\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)

  2. 引用:openQuote\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)

  3. 字符串:double/single 引号内的任何内容:(当前正则表达式不工作 ".*"")

我有以下问题 1.正则表达式匹配单括号(伪select或内容属性中不能嵌套括号) 2.Single 将按给定顺序匹配计数器、属性、url 和字符串内容的正则表达式(顺序很重要,因为我想稍后用评估值替换它们)

如果需要更多信息,请告诉我。 谢谢

您的第一个正则表达式确实匹配嵌套括号(但不匹配转义括号)。这是可取的吗?

没有嵌套和转义,这些就简单多了。
这是忽略嵌套可能性的第一个正则表达式的变体:

counter\([^)]*\)

它匹配文字 counter(,然后是零个或多个非右括号,最后是右括号。 (your first regex and my simpler version 在 regex101 的完整解释。)

我相信这回答了你的第一个问题,但如果你真的在寻找一个 "regex to match [a] single parenthesis," 那只是 [()],它将匹配左括号或右括号字符。如果您知道要匹配哪一个,也可以显式匹配 \(\)

匹配引号(不考虑嵌套或转义引号)同样容易:

"[^"]*"

这匹配一个文字双引号字符 ("),然后是零个或多个非双引号字符,然后是另一个文字双引号字符。

您的第二个请求是 "single regex that will match the counter, attribute , url and string content in the given order (order is important because i want to replace them later with evaluated values)."

我不确定您打算如何获得 CSS content property's value, given how that's typically in an ::after or ::before pseudo-class, which are not available from the DOM,但这里有一些填充它的虚拟代码,因此我们可以对其进行操作:

var css = `content: counter(item)" " attr(data) "" counter(item1,decimal) url('test.jpeg') "hi" attr(xyz); color:red;`;

// harvest last `content` property (this is tricked by `content: "content: blah"`)
var content = css.match(/.*\bcontent:\s*([^;"']*(?:"[^"]*"[^;"']*|'[^']*'[^;"']*)*)/);
if (content) {
  var part_re = /(?:"([^"]*)"|'([^']*)'|(?:counter|attr|url)\(([^)]*)\))/g;
  while ( part = part_re.exec(content[1]) ) { // parse on just the value
    if      (part[0].match(/^"/))       { /* do stuff to part[1] */ }
    else if (part[0].match(/^'/))       { /* do stuff to part[2] */ }
    else if (part[0].match(/^counter/)) { /* do stuff to part[3] */ }
    else if (part[0].match(/^attr/))    { /* do stuff to part[3] */ }
    else if (part[0].match(/^url/))     { /* do stuff to part[3] */ }

    // silently skips other values, like `open-quote` or `counters(name, string)`
  }
}

第一个正则表达式(第 4 行)从 CSS 中提取最后一个 content 属性(最后一个是因为它会覆盖以前的实例,但请注意这样一个事实愚蠢地从 content: "content: blah" 中提取 content: blah)。在找到分词符的最后一个实例然后 content: 之后,它会吸收所有空格,然后匹配该行的其余部分,直到出现分号、双引号或单引号。非捕获组允许双引号或单引号之间的任何内容,这与我们匹配此答案顶部附近的引号的方式大致相同。 (this CSS content regex 在 regex101 的完整解释。)

第二个正则表达式(第 7 行,分配给 part_re)处于 while 循环中,因此我们可以按顺序处理 content 属性 中的每个单独值。它匹配双引号字符串或单引号字符串或某些命名值(counter 或 attr 或 url)。查看值数据存储位置的条件和注释。 this value parsing regex 在 regex101 的完整解释(请参阅右栏中间的 "Match Information" 以了解我如何存储值的数据)。