[英]Regex excluding strings in between two slashes on URL
我有这样的正则表达式,如基basename/(.+)/(.+)/(.+)/?$
但问题是这是一个贪婪的正则表达式。 我想在第二个匹配项中排除某些字符串,以便如果它与列入黑名单的字符串之一匹配,它将返回false。
此问题与https://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules上的其他问题有关,唯一的区别是方法。
希望你们能帮助我。 谢谢!
编辑:这是我正在尝试的工作方式: basename/(.+)/!(string1|string2|string3).*/(.+)/?$
(从注释中添加)
附注:我已经看到了这一点,但这似乎与我想要的不一样。
我的第一个if / else正则表达式条件很酷:)?
basename\\/(.+)\\/(?(?=(?:bar|string2|string3)\\/)^|(.+))\\/(.+)\\/?$
那么这是什么意思 ?
basename\\/
:匹配basename/
(.+)\\/
:直到/
找到并匹配/
(?(?=(?:bar|string2|string3)\\/)^|(.+))
:棘手的部分,我们将其拆分:
(?
:这意味着如果 (?=(?:bar|string2|string3)\\/)
:正向查找,检查是否存在bar/
或string2/
或string3/
。 ^
:如果前瞻成功,则进行匹配。 ^
表示行的开头,因为我们在字符串的中间,所以它将始终返回false! |(.+)
:否则,匹配所有内容,直到... bar/
或string2/
或string3/
,如果存在匹配项,那么我们将寻找第^
行的开头,该行将始终返回false(我们的意图),否则将进一步匹配(.*)
\\/(.+)\\/?$
:匹配/
,然后匹配任何东西,直到/
可选。 $
表示行尾。 您将要使具有相同模式(/ dir)延迟匹配(使用?)的捕获组。
对于诸如以下的字符串:
basename/dir1/dir2/dir3/
basename/dir1/string1/dir3/
basename/dir1/string2/dir3/
以下正则表达式将在后两个返回false,但捕获第一个:
basename/(.+?)/(?!string1|string2|string3)(.+?)/(.+?)/$
PHP小提琴: http : //phpfiddle.org/lite/code/1qr-iip
您可以使用.*?
而不是.*
使其变得不贪心,但最好使用排除/
的贪心匹配。 即[^/]*
。
您的问题不是很清楚。 我不确定您正在使用!(x|y|z)
构造函数。 那!
是文字。 那是你想要的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.