1

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

这个问题与我在https://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules上 的另一个问题有关,唯一的区别是方法。

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

编辑:这是我试图工作的内容:(basename/(.+)/!(string1|string2|string3).*/(.+)/?$从评论中添加)

PS我见过这个,但这似乎不是我想要的。

4

3 回答 3

2

我的第一个 if/else 正则表达式条件,很酷吧 :) ?
basename\/(.+)\/(?(?=(?:bar|string2|string3)\/)^|(.+))\/(.+)\/?$

那么这是什么意思 ?

  • basename\/: 匹配basename/
  • (.+)\/:/找到并匹配之前的任何内容/
  • (?(?=(?:bar|string2|string3)\/)^|(.+)):棘手的部分,我们将其分开:
    • (?: 这意味着如果
    • (?=(?:bar|string2|string3)\/): 正向前瞻,检查是否有bar/or string2/, or string3/.
    • ^:如果前瞻成功,则匹配此。^表示行首,因为我们在字符串的中间,这将始终返回 false !
    • |(.+):否则,匹配所有内容,直到...
    • 总而言之,我们检查是否有bar/orstring2/string3/,如果有匹配,那么我们将寻找行的开头,^它总是返回 false (我们的意图),否则进一步匹配(.*)
  • \/(.+)\/?$: match /,然后是任何东西,直到/可选。$表示行尾。

在线演示

于 2013-06-07T15:49:23.547 回答
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

于 2013-06-07T15:46:26.213 回答
0

你可以使用.*?而不是.*让它变得不贪心,但你可能会更好地使用排除/. 即[^/]*

你的问题不是那么清楚。我不确定你在用这个!(x|y|z)构造做什么。那!是字面意思。那是你的意图吗?

于 2013-06-07T16:15:10.663 回答