【问题标题】:Perl regex to find a string that is not matchedPerl 正则表达式查找不匹配的字符串
【发布时间】:2017-08-29 08:33:12
【问题描述】:

我需要在 perl 中找到一个与给定正则表达式不匹配的字符串。例如:如果字符串是:

%3C9ba91570d204095439e82b74ab4d74b0%3E%3Cma%3E%3C5975%3E

我需要获取 'ma',它是 '%3C' 和 '%3E' 子字符串中的一个字符串。所以这两个子字符串中的任何字符串都应该匹配。我的意思是,如果 'ma' 不存在,它可能是任何其他字符串 ('am'),如本例所示:

 %3C9ba91570d204095439e82b74ab4d74b0%3E%3Cam%3E%3C5975%3E

将在 apache 的 RewriteRule 中使用,以便将获取的值存储在环境变量中。

我试过这个,但它没有达到我想要的效果:

RewriteEngine on
RewriteCond %{HTTP_COOKIE} (%3C.*?%3E%3C.*?)(.*)
RewriteRule ^.*$ - [E=FetchedValue:%2]

任何解决这个问题的帮助都会很棒......!

【问题讨论】:

  • 如果您尝试:RewriteCond %{HTTP_COOKIE} %3C(.*?)%3E 和 RewriteRule ^.*$ - [E=FetchedValue:%1]?
  • 不,它给出 9ba91570d204095439e82b74ab4d74b0,但我需要 'ma' 子字符串。
  • RewriteCond %{HTTP_COOKIE} (ma|am)%3C(.*?)%3E 和 RewriteRule ^.*$ - [E=FetchedValue:%2] 怎么样
  • 不,这种类型的正则表达式不起作用,因为 (ma|am) 是未知的。它也可能是任何其他字符串。我需要匹配 '%3C' 和 '%3E' 中的任何字符串,并且在第二次出现时也是如此。
  • RewriteCond %{HTTP_COOKIE} %3C.*?%3E%3C(.*?)%3E 和 RewriteRule ^.*$ - [E=FetchedValue:%1]

标签: regex apache perl mod-rewrite


【解决方案1】:

如果您确定它始终是 %3C 和 %3E 之间的第二个字符串,则有多种可能性,例如:

RewriteEngine on RewriteCond %{HTTP_COOKIE} %3C.*?%3E.*?%3C(.*?)%3E RewriteRule ^.*$ - [E=FetchedValue:%1]

【讨论】:

    【解决方案2】:

    我认为你的正则表达式很好。另一方面,您有输入/规范问题。根据您的正则表达式考虑以下grep 命令:

    echo '%3C9ba91570d204095439e82b74ab4d74b0%3E%3Cma%3E%3C5975%3E' | grep -Po '%3C.*?%3E'
    
    • grep -P 启用 perl 语法。我跳过了结尾的 .* 部分,否则它与您的正则表达式相同。
    • grep -o 将只保留匹配项

    所以,我们得到了三场比赛,第二场是你想要的:

    $ echo '%3C9ba91570d204095439e82b74ab4d74b0%3E%3Cma%3E%3C5975%3E' | grep -Po '%3C.*?%3E'
    %3C9ba91570d204095439e82b74ab4d74b0%3E
    %3Cma%3E
    %3C5975%3E
    

    所以,这提出了两个问题:

    1. 这是一个有效的 cookie 值吗
    2. 您想如何区分 ma 匹配和其他两个匹配?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2018-07-16
      • 2015-06-15
      • 2015-04-02
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多