【问题标题】:Regexp that ignores everything after a question mark symbol忽略问号符号后所有内容的正则表达式
【发布时间】:2017-09-02 04:56:24
【问题描述】:

这是我试图用正则表达式解析的完整字符串:

example.com/newsite.com.html?var=/newsite.com&var=newsite.com

我希望能够匹配字符串的 newsite.com 部分,但前提是它不会出现在 ? 符号之后。

目前,我只到此为止:

/newsite.com/g

选择newsite.com 的所有实例,而不仅仅是第一个。

链接到正则表达式操场http://regexr.com/3fmre

编辑:

这里* 代表我想忽略的所有内容,基本上只匹配newsite.com 的第一次出现:

example.com/newsite.com.html?****************************

【问题讨论】:

  • [^?]* 将匹配除 ? 之外的所有内容
  • 谢谢,但是我该怎么用呢?

标签: regex apache url mod-rewrite


【解决方案1】:

您可以使用RewriteCond 并仅测试REQUEST_URIQUERY_STRING 不是 REQUEST_URI 的一部分,所以类似于:

RewriteCond %{REQUEST_URI} newsite\.com
RewriteRule your rules if the cond if matched

【讨论】:

  • 这实际上是我现在想要做的,但我被困住了,因为我想要一个像这样的通用名称:RewriteCond %{REQUEST_URI} %{SERVER_NAME} 但它似乎不起作用,我没有不知道为什么。条件的第二部分不允许使用变量吗?
  • 而且,如果它们确实有效,我将如何转义变量值中间的点?附言REQUEST_URI 确实包含 QUERY_STRING 但没关系,因为我总是可以单独测试查询字符串中的 !newsite\.com
  • 根据 Apache 的手册,它不应该包含它:“REQUEST_URI 请求的 URI 的路径组件,例如“/index.html”。这特别排除了可以作为自己的查询字符串名为 QUERY_STRING 的变量。” httpd.apache.org/docs/current/mod/mod_rewrite.html
  • 不,这些变量仅可用于测试事物,请允许我不太了解您要实现的目标。
  • 谢谢,奇怪的是,当我在 php 中回显 REQUEST_URI 时,它会显示查询字符串,但如果我直接测试它不会显示它。也许 php 正在使用其他一些环境变量。我正在尝试根据天气允许资源是否包含其中的域名。
【解决方案2】:

您可以使用[^?],它是一个排除组,它匹配除其中指定的符号之外的所有符号,在本例中为?。例如,表达式 /^[^?]*/ 将从一开始就匹配所有内容,直到找到 ?(这不会是匹配的一部分)。

如果您希望它只匹配从newsite.com 开始,您可以使用/newsite\.com[^?]*/,或者从? 到末尾,您可以使用/[^?]*$/

由于您标记了mod-rewrite,您还可以选择使用%{QUERY_STRING} 作为条件。查询字符串基本上就是我们如何称呼完整 URL 中 ? 之后的内容。

例如,使用RewriteCond %{QUERY_STRING} newsite.com 将暗示此条件后的RewriteRule 仅适用于在查询字符串中找到newsite.com 的情况。

【讨论】:

  • 谢谢,但它似乎不起作用。我试图忽略? 之后的所有内容,甚至出现newsite.com
  • @Danchm01 也许你应该告诉我们你想要做什么。
  • 感谢您指出%{QUERY_STRING} 这实际上可能很有用。至于正则表达式,您的示例匹配newsite.com,然后不匹配newsite.com?,但我想做的是忽略? 之后的所有内容,就像newsite.com.html?**************,其中* 是被忽略的
  • 如果您点击我提供的游乐场链接,说明我的意思会容易得多。
  • 我认为这不是玩正则表达式的问题,而是使用mod-rewrite为您提供的其他功能。
【解决方案3】:

这是我想出的解决方案,它不是防弹的,但在大多数情况下都有效:

(?<=[^=]\/)newsite\.com

它会忽略以= 开头且开头没有/ 的任何内容。

请注意,这只适用于支持“正向后视”的正则表达式实现。

【讨论】:

    【解决方案4】:

    这里有两种方法..

            var str = "example.com/newsite.com.html?var=/newsite.com&var=newsite.com"; 
     //1. Look for ? and get the substring from 0 to the foundAt value
            var foundAt = str.indexOf('?');
                document.getElementById("substr").innerHTML = str.substr(0,foundAt);
                
    //2. Using regex find the location of occurence of newsite.com and ignore rest          
     var str = "example.com/newsite.com.html?var=/newsite.com&var=newsite.com"; 
        var loc = str.search(/newsite\.com[^?]*/);
        document.getElementById("substr").innerHTML = loc;
        &lt;p id="substr"&gt;&lt;/p&gt;

    【讨论】:

    • 感谢您的回答,这将是一种解决方案,但我只能使用正则表达式而不是完整的编程语言。所以我不能使用 JavaScript 并用数组索引截断字符串。
    • post 被标记为 apache/mod-rewrite,因此此时没有 JS 涉及或可用
    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多