正则表达式匹配WP重定向插件中不以字符串开头的URL

时间:2015-05-29 07:19:22

标签: php regex wordpress redirect

目前,我在WordPress中使用重定向插件以这种方式重定向包含q问号的所有网址:

Source: /(.*)\?(.*)$
Target: /$1

这很有效。它会使用?重定向任何链接,例如/good-friends-are-great.html?param=x/good-friends-are-great.html

但是,现在我需要例外。我需要允许/friends传递GET参数,例如/friends?guest=1&event=chill_out&submit=2/friends/?more_params,不会截断参数。

我尝试将插件中的正则表达式修改为:

Source: /(?!friends/?)\?(.*)$
Target: /$1

但这并没有奏效。使用上面的表达式,任何与?的链接都不再重定向。

你能帮忙吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

/(.*(?<!friends)(?<!friends/))\?.*$

See demo

正则表达式使用2个负面的后视镜,因为在这种正则表达式中,我们不能使用可变宽度的后视镜。 (.*(?<!friends)(?<!friends/))匹配任意数量的任何字符,最多?,但检查?前面是friends还是friends/

修改

这是我的第一个正则表达式在当前场景中效果不佳:

/((?:(?!friends/?).)+)\?.*$

其子模式(?:(?!friends/?).)+匹配不包含friendsfriends/的字符串。

答案 1 :(得分:0)

您应该刚刚添加到第一个(.*),而不是替换第一个Source: /(?!friends/?)(.*)\?(.*)$ Target: /$1

(?!friends/?)

否定前瞻组hashCode本身并不匹配任何内容;它只是阻止某些比赛。