【问题标题】:Regex to match URL that does not begin with string in WP Redirection plugin正则表达式匹配 WP 重定向插件中不以字符串开头的 URL
【发布时间】:2015-08-11 23:03:52
【问题描述】:

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

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 OR /friends/?more_params,不截断参数。

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

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

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

你能帮忙吗?

【问题讨论】:

    标签: php regex wordpress redirect


    【解决方案1】:

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

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

    See demo

    正则表达式使用 2 个否定的look-behinds,因为在这种正则表达式风格中,我们不能使用可变宽度的look-behinds。 (.*(?&lt;!friends)(?&lt;!friends/)) 匹配不超过? 的任意数量的任意字符,但检查? 前面是否没有friendsfriends/

    编辑:

    这是我的第一个正则表达式,它不适用于当前场景:

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

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

    【讨论】:

    • 感谢您的及时回复!第一个答案非常接近,但有一次失败:1)/friends-are-good.html?param 其中 param 指的是在? 之后附加的任何 GET 参数。 1) 中的参数应该被截断,但事实并非如此。但第二个答案满足所有条件!
    • 我已经删除了错误的建议,并对可行的建议添加了解释。
    • 感谢您添加解释(我正要问)!实际上,您可以保留第一个答案不变,因为它有助于像我这样的人更好地理解正则表达式。
    • 我将第一个正则表达式放回答案中。
    【解决方案2】:

    而不是替换第一个(.*),您应该刚刚添加到它:

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

    负前瞻组(?!friends/?) 本身不匹配任何内容;它只是阻止某些匹配。

    【讨论】:

    • 感谢您的及时回复!答案很接近,但有 2 次失败:1) /friends-are-good.html?param 和 2) /friends/?param 其中 param 是指在 ? 之后附加的任何 GET 参数。 1) 中的参数应该被截断,但事实并非如此。 2) 中的参数不应被截断,但确实如此。很抱歉,如果我的问题不够清楚。
    猜你喜欢
    • 2013-10-10
    • 2014-08-15
    • 2011-01-08
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2021-03-19
    • 2015-02-26
    相关资源
    最近更新 更多