繁体   English   中英

正则表达式排除URL的两个斜杠之间的字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM