【问题标题】:Regex excluding strings in between two slashes on URL正则表达式排除 URL 上两个斜杠之间的字符串
【发布时间】:2013-06-03 22:00:43
【问题描述】:

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

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

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

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

附:我见过this,但这似乎不是我想要的。

【问题讨论】:

  • U修饰符让它变得不贪心
  • 我已将评论整合到问题中。请参阅编辑

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


【解决方案1】:

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

那么这是什么意思呢?

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

Online demo

【讨论】:

  • 起初我以为它不起作用..但我只需要避开斜线..这很棒。谢谢! +1 正则表达式测试器。这比我使用的要好得多。
  • @reikyoushin 谢谢 :) 您可以使用其他分隔符,例如#,这样您就不需要转义/(当然,如果需要,您应该转义#!)。
  • 其实我已经用#了。 ;) 顺便说一句,为什么我的测试人员无法识别选项(gm)中的g,我在spaweditor.com/scripts/regex/index.php之前使用这些@
  • @reikyoushin 在 PHP 中没有 g 修饰符,在 JavaScript 中存在 g 修饰符,意思是“匹配所有”。如果我没有将g 修饰符放在在线测试器中,它只会匹配第一个实例。在 PHP 中,您将使用 preg_match 匹配一个实例,并使用 preg_match_all 匹配所有实例(在 JavaScript 中为 g)。
【解决方案2】:

您需要创建具有相同模式 (/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

【讨论】:

  • 问题是,这将不匹配basename/dir1/string1cool/dir3/
【解决方案3】:

您可以使用.*? 而不是.* 来使其变得不贪心,但您可能会更好地使用排除/ 的贪心匹配。即[^/]*

你的问题不是很清楚。我不确定您在使用 !(x|y|z) 构造做什么。 ! 是一个文字。这是你的本意吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2015-11-21
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多