我有一个像basename/(.+)/(.+)/(.+)/?$
这样的正则表达式,但问题是这是一个贪婪的正则表达式。
我想在第二场比赛中排除某些字符串,这样如果它与其中一个列入黑名单的字符串匹配,它将返回false ..
此问题与https://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules上的其他问题有关。 唯一不同的是方法。
希望你们能帮助我。谢谢!
编辑:以下是我尝试使用的内容:basename/(.+)/!(string1|string2|string3).*/(.+)/?$
(从评论中添加)
P.S。我见过this,但这似乎不是我想要的。
答案 0 :(得分:2)
我的第一个if / else正则表达式条件,酷吧:)?
basename\/(.+)\/(?(?=(?:bar|string2|string3)\/)^|(.+))\/(.+)\/?$
那是什么意思?
basename\/
:匹配basename/
(.+)\/
:找到/
并匹配/
(?(?=(?:bar|string2|string3)\/)^|(.+))
:棘手的部分,我们将其拆分:
(?
:这意味着 if (?=(?:bar|string2|string3)\/)
:积极向前看,检查是bar/
还是string2/
还是string3/
。^
:如果前瞻成功,则匹配此项。 ^
表示行首,因为我们位于字符串的中间,总是返回false!|(.+)
:否则,匹配所有内容直到...... bar/
或string2/
或string3/
,如果匹配,我们会查找行^
的开头总是会返回false(我们的意图),否则会进一步匹配(.*)
\/(.+)\/?$
:匹配/
,然后选择/
之前的任何内容。 $
表示行尾。答案 1 :(得分:0)
你想要制作具有相同模式(/ dir)延迟匹配的catch组(使用?)。
对于字符串,例如:
basename/dir1/dir2/dir3/
basename/dir1/string1/dir3/
basename/dir1/string2/dir3/
以下正则表达式将为后两个返回false但是赶上第一个:
basename/(.+?)/(?!string1|string2|string3)(.+?)/(.+?)/$
答案 2 :(得分:0)
您可以使用.*?
代替.*
来使其不合适,但是对于排除/
的贪婪匹配,您可能会更好。即[^/]*
。
你的问题并不是那么清楚。我不确定你对!(x|y|z)
构造做了什么。 !
是一个文字。那是你的意图吗?