3

示例网址 = http://www.example.com/aa/bb/cc/dd?q=ab&c=1

所以在这个网址中,我需要在最后一个斜杠之后和问号之前的值 dd

如何为此编写正则表达式

我已经写了在最后一个斜杠之后获取值,但无法弄清楚如何在查询字符串之前获取唯一的值“dd”。

正则表达式:[^/]+$

4

3 回答 3

5

您可以使用下面的正则表达式。此正则表达式将匹配所有后跟?. 在您的情况下,它将是dd.

编辑:更新正则表达式以使用\w而不仅仅是字母。

[^\/][\w]+(?=\?)

解释

[^\/] -- Do not match /
[\w]+ -- match word characters (letters, digits, underscore) 
(?=\?) -- Positive lookahead: Match alphabets(above condition) that are followed by a ?
于 2012-07-06T07:25:51.483 回答
3

这将起作用,从技术上讲,它可以获取“/”和“?”之间的任何内容。您可能必须转义“/”,但我没有看到它在您的中转义,所以我没有转义。

/([^/\?]+)\?

于 2012-07-06T06:51:18.740 回答
1
#(.*)/(.*)\?(.*)#

由于我不确定您使用的是什么语言,所以我写了这个来为 PHP 工作。适应您正在使用的任何语言应该不难。

正则表达式的细分:

  • #- 正则表达式的开始和结束符号。
  • (.*)/- 匹配url中 final之前的任何内容。/
  • (.*)\?- 匹配最后/和之前之间的内容?
  • 尾随(.*)#- 匹配 后面的任何内容?,通常是查询字符串。

当然,正则表达式可以更短,但是这样,如果您认为合适,您还可以使用所获得 URL 的其他详细信息。

编辑

我已使用此代码,以及您提供的示例 URL:

<?php
    $url = "http://www.abc.com/aa/bb/cc/dd?q=ab&c=1";
    $regex = "#(.*)/(.*)\?(.*)#";
    preg_match_all($regex, $url, $matches);
    var_dump($matches);
?>

这是它返回的内容:

array
  0 => 
    array
      0 => string 'http://www.abc.com/aa/bb/cc/dd?q=ab&c=1' (length=39)
  1 => 
    array
      0 => string 'http://www.abc.com/aa/bb/cc' (length=27)
  2 => 
    array
      0 => string 'dd' (length=2)
  3 => 
    array
      0 => string 'q=ab&c=1' (length=8)

如您所见,正则表达式有效。

于 2012-07-06T06:55:21.653 回答