使用正则表达式和PHP将多个字符串匹配并存储在一个字符串中


Matching and storing multiple strings in one string with regular expressions and PHP

我正在尝试将URI转换为我创建的URI类中的键和值对。URI是干净的,不能解析为$_GET变量。解决方案必须在PHP中,而不是在Apache的mod_rewrite中。

考虑这个URI:/category/music/rows=30/page=12/

我想要的键值对如下:

数组("类别"、"音乐"、"行"、"30"、"页面"、"12")

为了尝试实现这一点,我写了以下示例代码:

$arr = array();
preg_match('/(category'/(?<category>['w-_]+)|rows=(?<rows>'d+)|page=(?<page>'d+))+/', 
        "category/music/rows=30/page=12", $arr);
var_dump($arr);

输出:

array
  0 => string 'category/music' (length=14)
  1 => string 'category/music' (length=14)
  'category' => string 'music' (length=5)
  2 => string 'music' (length=5)

当时的想法是,我想一次或多次匹配组中的任何一个(/(匹配这个|或这个|或这)+/)。我假设这里的问题是它匹配一次,然后停止。此外,对或语句进行分组的括号会导致不需要存储的匹配(不需要字符串"category/music")。

我可能错过了一些显而易见的东西,但我想不通。我意识到我可以跑三次preg_match,但似乎必须有办法用一个表达式来做到这一点。我还想保持代码简短。

编辑:preg_match_all有效,我已经将regex修改为:

/类别/(?[''w-_]+)|行=(?''d+)|页=(?[d+)/

然而,我现在得到的结果是:

array
  0 => 
    array
      0 => string 'category/music' (length=14)
      1 => string 'rows=30' (length=7)
      2 => string 'page=12' (length=7)
  'category' => 
    array
      0 => string 'music' (length=5)
      1 => string '' (length=0)
      2 => string '' (length=0)
  1 => 
    array
      0 => string 'music' (length=5)
      1 => string '' (length=0)
      2 => string '' (length=0)
  'rows' => 
    array
      0 => string '' (length=0)
      1 => string '30' (length=2)
      2 => string '' (length=0)
  2 => 
    array
      0 => string '' (length=0)
      1 => string '30' (length=2)
      2 => string '' (length=0)
  'page' => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)
      2 => string '12' (length=2)
  3 => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)
      2 => string '12' (length=2)

如果它不同时存储"类别/音乐"、"行+30"、"page=12",那将是理想的选择。它还匹配了许多不必要的空白字符串。

尝试使用preg_match_all,看看这是否有帮助。preg_match在找到第一个匹配之后停止。

要摆脱匹配1("类别/音乐"),请尝试使用非捕获组,也可以这样做:

(?:category'/(?<category>['w-_]+)

而不是

(category'/(?<category>['w-_]+)