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

时间:2013-06-07 14:38:02

标签: php regex wordpress url-rewriting regex-negation

我有一个像basename/(.+)/(.+)/(.+)/?$这样的正则表达式,但问题是这是一个贪婪的正则表达式。 我想在第二场比赛中排除某些字符串,这样如果它与其中一个列入黑名单的字符串匹配,它将返回false ..

此问题与https://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules上的其他问题有关。 唯一不同的是方法。

希望你们能帮助我。谢谢!

编辑:以下是我尝试使用的内容:basename/(.+)/!(string1|string2|string3).*/(.+)/?$(从评论中添加)

P.S。我见过this,但这似乎不是我想要的。

3 个答案:

答案 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(我们的意图),否则会进一步匹配(.*)
  • \/(.+)\/?$:匹配/,然后选择/之前的任何内容。 $表示行尾。

Online demo

答案 1 :(得分:0)

你想要制作具有相同模式(/ dir)延迟匹配的catch组(使用?)。

对于字符串,例如:

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

答案 2 :(得分:0)

您可以使用.*?代替.*来使其不合适,但是对于排除/的贪婪匹配,您可能会更好。即[^/]*

你的问题并不是那么清楚。我不确定你对!(x|y|z)构造做了什么。 !是一个文字。那是你的意图吗?