2015-05-29 57 views
3

目前,我使用的是在WordPress插件重定向重定向到包含q问号这样所有的URL网址:正则表达式匹配不与字符串WP重定向插件开始

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 

但这并没有工作。通过上述表达式,任何与?的链接都不再被重定向。

你能帮忙吗?

回答

1

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

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

See demo

正则表达式是使用2负的样子,屁股因为在这个正则表达式的味道,我们不能使用可变宽度的样子,屁股。 (.*(?<!friends)(?<!friends/))?之间的任何字符匹配,但会检查?是否先于friendsfriends/

编辑:

这是我未对目前的情况很好地工作第一正则表达式:

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

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

+0

感谢您的及时回复!第一个答案非常接近,但在1次失败:1)'/friends-are-good.html?param',其中param指的是在'?'后面附加的任何GET参数。 1)中的参数应该被截断,但不是。但第二个答案满足所有条件! – GooDoo

+1

我已删除错误的建议,并向有效的人员添加了解释。 –

+0

感谢您添加解释(我正要问)!实际上,您可以保留第一个答案,因为它对像我这样的人更好地理解正则表达式很有用。 – GooDoo

0

,而不是替换第一(.*),你应该刚刚加入到它:

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

负前瞻组(?!friends/?)不匹配本身什么;它只是防止某些匹配。

+0

感谢您的及时回复!答案很接近,但在两次失败:1)'/friends-are-good.html?param'和2)'/ friends /?param',其中param指的是在'?'后面附加的任何GET参数。 1)中的参数应该被截断,但不是。 2)中的参数不应该被截断,但它是。很抱歉,如果我的问题不够清楚。 – GooDoo

相关问题