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+)
(\s?\s+)
或|
- 没什么。这意味着替代品不在也没关系,只是我们不会捕获任何东西
)
尝试了解此组,它与上面的组相同(?=.*键入[:=](\S+)
可选匹配:尝试捕获“title”,然后在该字符串中的任何位置捕获“:”或“=”。如果存在,将指针移到此位置,否则将回溯并使该组失败(?:.*?title[:=])?
分支重置-使用相同的捕获组ID进行以下替换:(?|
如果指针位置与某个引号匹配,请尝试将其中的所有内容匹配到下一个引号。捕获组:捕获其中的所有内容并完成分支重置组“([^”]+)”
或|
打开一个捕获组(
一组(?:
消极前瞻-声明以下情况不适用:(?!
一个可选的空格,后跟“type”或“sequence”\s?(?:type | status))
然后,匹配一个字符
重复,直到没有更多)+
关闭两个组)
吃掉了行的其余部分。在这一点上,这并不重要[^”]*
断言字符串末尾的位置$
\n
由于多行元素而存在。对于您的实际使用,您将不会拥有它。请参阅正则表达式:
/^(?=.*status[:=](\S+)|)(?=.*type[:=](\S+)|)(?:.*?title[:=])?(?|"([^"]+)"|((?:(?!\s?(?:type|status)).)+))[^"]*$/
您可以使用捕获组提取信息
这里有一个
表达式说明:
断言字符串开头的位置^
正向前瞻-在我们的匹配中断言以下匹配:(?=
什么,然后:*
字符序列“状态”,后跟“:”或“=”状态[:=]
捕获组-下一个非空白序列(\S+)
(\s?\s+)
或|
- 没什么。这意味着替代品不在也没关系,只是我们不会捕获任何东西
)
尝试了解此组,它与上面的组相同(?=.*键入[:=](\S+)
可选匹配:尝试捕获“title”,然后在该字符串中的任何位置捕获“:”或“=”。如果存在,将指针移到此位置,否则将回溯并使该组失败(?:.*?title[:=])?
(?|