【问题标题】:Skip match if in specific context如果在特定上下文中,则跳过匹配
【发布时间】:2019-10-25 19:23:55
【问题描述】:

正则表达式模式需要匹配指定单词的所有实例,它不仅需要匹配单个单词,还需要匹配词内内容。

例如搜索media 匹配mediator 中的实例。

很少有例外。如果单词内容在 url 或 font-family 声明中,则匹配应跳过。这是我到目前为止提出的代码,但我遗漏了一些东西,因为它跳过了所有内容。

(?:font-family:|https?:\/\/)[^\s\'";}]*(*SKIP)(*FAIL)(media)

以上可以是tested at Regex101

【问题讨论】:

  • 请附上您尝试从中提取匹配项的文本示例。
  • @TimBiegeleisen 请查看网址
  • 在 SKIP FAIL 之后您需要一个| 并且可能还匹配左侧的媒体以确保它是字体系列或 https 的一部分? (?:font-family:\s*|https?:\/\/)[^\s'";}]*\bmedia\b(*SKIP)(*FAIL)|\bmedia\bregex101.com/r/HCZ473/1,但我不确定这会涵盖您可能指定的所有方式font-family:
  • @Thefourthbird 非常感谢您的帮助,显然我省略了 |操作员。我想出了这个正则表达式regex101.com/r/5CX3Ea/3,但它仍然捕捉到“font-family:media”
  • @kole23 你试过这个模式吗? regex101.com/r/jAjmUK/1font-family 后面有 1+ 个空格:

标签: php regex


【解决方案1】:

你可以在(*SKIP)(*FAIL)后面加一个管道,font-family:后面有一个空格

请注意,您不必转义字符类中的 \',如果您将分隔符更改为 / 以外的其他内容,您也不必转义这些。您也可以省略媒体周围的捕获组。

(?:font-family:\h*|https?:\/\/)[^\s'";}]*(*SKIP)(*FAIL)|\bmedia\b
  • (?:非捕获组
    • font-family:\h* 匹配 font:family: 和 0+ 个水平空白字符
    • |或者
    • https?:\/\/匹配http和可选s
  • )关闭非捕获组
  • [^\s'";}]* 匹配除 '"; 或空白字符以外的任何字符 0+ 次
  • (*SKIP)(*FAIL) 消费和避免使用SKIP and FAIL
  • |
  • \bmedia\b 在单词边界之间匹配媒体

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2020-07-01
    相关资源
    最近更新 更多