1

和往常一样,我是世界上最糟糕的正则表达式制造者。但这次我真的试过了。

所以我的目标是制作一个处理搜索相关内容的正则表达式。搜索查询可能是这样的:

  • 堆栈溢出
  • “堆栈溢出”
  • 标题="堆栈溢出"
  • 类型:图像标题=堆栈溢出
  • 堆栈溢出类型:图像
  • 状态:关闭类型:图像标题:堆栈溢出

但它应该能够单独检测它们。它应该能够检测直接匹配的引用。只有标题,必须在其后面有搜索查询,但其他条件可以是任何顺序。

现在我被困住了..我设法做到了这个正则表达式。它仅适用于状态:关闭类型:图像标题:堆栈溢出。事物之间的点()使它起作用。如果我用 | 替换它,那么我得到第一部分匹配。但是让这个工作,所有可能的查询格式对我来说是不可能的。

/(?:(?:status[:](closed|open)).(?:type[:](image|video)).(?:(?:title|author|actor|movie)[:](.+)))/i

这是工具,我试着做这一切:http ://regexr.com/39an1我的涂鸦也在里面。

这是针对搜索引擎类型的东西。所以我希望匹配的结果,在 PHP 内部很容易使用。另外,我认为有人可以从中受益匪浅,它会有一个解决方案。

如果有人可以立即将我指向正确的位置,至少带有点与 | 在主要()事物之间。感觉就像 | = 或,但我想要有点像 and-or 的东西。

4

1 回答 1

8

查看正则表达式:

/^(?=.*status[:=](\S+)|)(?=.*type[:=](\S+)|)(?:.*?title[:=])?(?|"([^"]+)"|((?:(?!\s?(?:type|status)).)+))[^"]*$/

您可以使用捕获组提取信息。

这是一个正则表达式演示

表达式解释:

  • ^断言字符串开头的位置。
  • (?=Positive lookahead - 在我们的匹配中断言以下匹配:
    • .*那么有些东西:
    • status[:=]字符序列"status",后跟":" 或 "="
    • (\S+) 捕获组 -下一个非空白序列。

如果你想为这个捕获组提供一个可选的空格:要允许status: falsestatus:false,然后将这个组和楼下的同一个组更改为(\s?\S+)!

    • | 或者
    • 没有。这意味着不存在替代项是可以的,只是我们不会捕获任何东西。
  • )
  • (?=.*type[:=](\S+)|)试着去理解这个组,和上面那组是一样的。
  • (?:.*?title[:=])?可选匹配:尝试在此字符串中的任何位置捕获“标题”后跟“:”或“=” 。如果存在,则将指针移动到该位置,否则回溯并使该组失败。
  • (?|分支重置 - 对以下交替使用相同的捕获组 ID:
    • "([^"]+)"如果我们的指针位置与引号匹配,则尝试将其中的所有内容匹配到下一个引号。捕获组:这将捕获其中的所有内容并完成分支重置组。
    • | 或者
    • (打开一个捕获组
      • (?:一群。
        • (?!负前瞻 - 断言以下不是:
          • \s?(?:type|status))一个可选的空格,后跟"type""sequence"
          • .然后,匹配一个字符。
        • )+重复直到没有更多。
    • ))关闭两个组。

(理论上,以下元素是多余的。)

  • [^"]*吃线的其余部分。在这一点上真的不重要。
  • $在字符串末尾断言位置。

由于\n多行元素,演示中的存在。对于您的实际使用,您将不会拥有它。

于 2014-08-14T00:08:25.200 回答