Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式只匹配全部条件,但对于搜索引擎来说,它应该满足更少的条件_Php_Regex_String_Template Matching_Capturing Group - Fatal编程技术网

Php 正则表达式只匹配全部条件,但对于搜索引擎来说,它应该满足更少的条件

Php 正则表达式只匹配全部条件,但对于搜索引擎来说,它应该满足更少的条件,php,regex,string,template-matching,capturing-group,Php,Regex,String,Template Matching,Capturing Group,和往常一样,我是世界上最差的正则表达式制作者。但这次我真的试过了 所以我的目标是制作一个正则表达式,处理搜索相关的东西。搜索查询可能是这样的: 堆栈溢出 “堆栈溢出” title=“堆栈溢出” 类型:图像标题=堆栈溢出 堆栈溢出类型:映像 状态:关闭类型:图像标题:堆栈溢出 但它应该能够分别检测到它们。。它应该能够检测到直接匹配的报价。。只有标题后面必须有搜索查询,但其他条件可以是任何顺序 现在我被卡住了。。我设法做了这个正则表达式。它仅适用于状态:关闭类型:图像标题:堆栈溢出。()之间的点

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

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

  • 堆栈溢出
  • “堆栈溢出”
  • title=“堆栈溢出”
  • 类型:图像标题=堆栈溢出
  • 堆栈溢出类型:映像
  • 状态:关闭类型:图像标题:堆栈溢出
但它应该能够分别检测到它们。。它应该能够检测到直接匹配的报价。。只有标题后面必须有搜索查询,但其他条件可以是任何顺序

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

/(?:(?:status[:](closed|open)).(?:type[:](image|video)).(?:(?:title|author|actor|movie)[:](.+)))/i
这是工具,我试着做到这一切:我的涂鸦也在那里

这是搜索引擎类型的东西。所以我希望比赛的结果,在PHP内部易于使用。另外,我认为有人可以从中受益匪浅,这将有一个解决方案

如果有人能马上给我指出,至少在主
()
之间有点和|。感觉像是|=或,但我想有点像and或之类的东西。

参见正则表达式:

/^(?=.*status[:=](\S+)|)(?=.*type[:=](\S+)|)(?:.*?title[:=])?(?|"([^"]+)"|((?:(?!\s?(?:type|status)).)+))[^"]*$/
您可以使用捕获组提取信息

这里有一个

表达式说明:

  • ^
    断言字符串开头的位置
  • (?=
    正向前瞻-在我们的匹配中断言以下匹配:
    • *
      什么,然后:
    • 状态[:=]
      字符序列“状态”,后跟“:”或“=”
    • (\S+)
      捕获组-下一个非空白序列
如果您希望为此捕获组提供可选空白:允许状态:false和状态:false,然后将此组和同一组更改为
(\s?\s+)

    • |
    • 没什么。这意味着替代品不在也没关系,只是我们不会捕获任何东西
  • (?=.*键入[:=](\S+)
    尝试了解此组,它与上面的组相同
  • (?:.*?title[:=])?
    可选匹配:尝试捕获“title”,然后在该字符串中的任何位置捕获“:”或“=”。如果存在,将指针移到此位置,否则将回溯并使该组失败
  • (?|
    分支重置-使用相同的捕获组ID进行以下替换:
    • “([^”]+)”
      如果指针位置与某个引号匹配,请尝试将其中的所有内容匹配到下一个引号。捕获组:捕获其中的所有内容并完成分支重置组
    • |
    • 打开一个捕获组
      • (?:
        一组
        • (?!
          消极前瞻-声明以下情况不适用:
          • \s?(?:type | status))
            一个可选的空格,后跟“type”“sequence”
          • 然后,匹配一个字符
        • )+
          重复,直到没有更多
    • 关闭两个组
(理论上,以下元素是多余的。)

  • [^”]*
    吃掉了行的其余部分。在这一点上,这并不重要
  • $
    断言字符串末尾的位置
演示中的
\n
由于多行元素而存在。对于您的实际使用,您将不会拥有它。

请参阅正则表达式:

/^(?=.*status[:=](\S+)|)(?=.*type[:=](\S+)|)(?:.*?title[:=])?(?|"([^"]+)"|((?:(?!\s?(?:type|status)).)+))[^"]*$/
您可以使用捕获组提取信息

这里有一个

表达式说明:

  • ^
    断言字符串开头的位置
  • (?=
    正向前瞻-在我们的匹配中断言以下匹配:
    • *
      什么,然后:
    • 状态[:=]
      字符序列“状态”,后跟“:”或“=”
    • (\S+)
      捕获组-下一个非空白序列
如果您希望为此捕获组提供可选空白:允许状态:false和状态:false,然后将此组和同一组更改为
(\s?\s+)

    • |
    • 没什么。这意味着替代品不在也没关系,只是我们不会捕获任何东西
  • (?=.*键入[:=](\S+)
    尝试了解此组,它与上面的组相同
  • (?:.*?title[:=])?
    可选匹配:尝试捕获“title”,然后在该字符串中的任何位置捕获“:”或“=”。如果存在,将指针移到此位置,否则将回溯并使该组失败
  • (?|