【问题标题】:preg_match_all and empty keyspreg_match_all 和空键
【发布时间】:2014-02-07 14:08:28
【问题描述】:

我正在尝试使用单个 preg_match_all 匹配两个正则表达式,我需要获取 2 个包含匹配项的数组。

这是我当前的代码:

$s = 'abab';
preg_match_all('/(a)|(b)/', $s, $a); 
var_dump($a);

效果很好,如果不考虑生成的多维数组是:

array (size=3)
  0 => 
    array (size=4)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string 'a' (length=1)
      3 => string 'b' (length=1)
  1 => 
    array (size=4)
      0 => string 'a' (length=1)
      1 => string '' (length=0)
      2 => string 'a' (length=1)
      3 => string '' (length=0)
  2 => 
    array (size=4)
      0 => string '' (length=0)
      1 => string 'b' (length=1)
      2 => string '' (length=0)
      3 => string 'b' (length=1)

所以,我可以使用$a[1]$a[2],但正如您所见,这些数组在“不匹配”键上有空值。

我需要:

array (size=3)
  0 => 
    array (size=4)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string 'a' (length=1)
      3 => string 'b' (length=1)
  1 => 
    array (size=2)
      0 => string 'a' (length=1)
      1 => string 'a' (length=1)
  2 => 
    array (size=2)
      0 => string 'b' (length=1)
      1 => string 'b' (length=1)

有一些参数要传递给preg_match_all 以获得没有空值的干净输出?我已经尝试过array_filter(),但它并没有删除它们我正在寻找一个简短的解决方案,所以我不能使用 array_filter 的回调(需要它来应对代码高尔夫挑战)。

【问题讨论】:

  • 这个输出正是文档所描述的。 “干净的输出”对您意味着什么?
  • 我要求一个没有空值的输出(如我的问题中所问)
  • 那是因为(a)|(b) 不是字母限制。并且所有 3 项在结果中都是正确的
  • 添加了预期的输出,让您了解所要求的内容

标签: php regex


【解决方案1】:

不知道,你为什么需要这样,但我想出最短的来满足你的要求。

$s = 'abab';
preg_match_all('/(a)|(b)/', $s, $a); 
// filter all at once
$a = array_map('array_filter', $a);
var_dump($a);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多