1

我有一个 PHPExcel 包装器,我有一个名为 的方法setColumn(),如下所示:

public function setColumn($cell = ""){
    if(empty($cell)){
        $cell = $this->cell;
    }
    $this->column = strtoupper(preg_replace("/[^A-Za-z]/", "", $cell));
    $this->cell   = "{$this->column}{$this->row}";
    return $this;
}

它工作得很好,但是当我使用它时,我可以传递范围,例如A1:D1当我这样做时,我的 preg_replace 将无法正确替换,它会返回AD我不想要的。我希望它返回A。我不确定完成此操作所需的正则表达式。

该参数$cell可以包含几个不同的值:

  • A1应该返回A
  • A1:D10应该返回A
  • AD10应该返回AD
  • AD1:BBB1应该返回AD

清单可以继续,但这是基础。那么我能做些什么来实现呢?

4

4 回答 4

3

匹配数字而不是可选冒号,然后匹配之后的所有内容

preg_replace("/\d:?.*/", "", $cell); 

或者正如 linepogl 指出的那样

preg_replace("/\d.*/", "", $cell); 

只要模式保持不变:字母数字一切

于 2013-09-03T20:05:25.160 回答
2

尝试:

preg_replace("/^([A-Z]+).*$/", "$1", $cell)

它将“保存”第一部分并删除其他所有内容。

正则表达式 101 演示

于 2013-09-03T20:05:15.890 回答
0

我能够想出另一个解决方案,(几乎在我提交问题后立即)。我所做的是在数组中爆炸:并使用数组中的第一项,如下所示:

public function setColumn($cell = ""){
    if(empty($cell)){
        $cell = $this->cell;
    }
    $rng          = explode(":", $cell);
    $this->column = strtoupper(preg_replace("/[^A-Za-z]/", "", $rng[0]));
    $this->cell   = "{$this->column}{$this->row}";
    return $this;
}
于 2013-09-03T20:16:25.923 回答
0

为了解释你在做什么以及你想做什么,我解释了下面的正则表达式。

您的正则表达式表示将数组 [A-Za-z] 中所有不是(由 ^ 表示)的字符替换为大写字母或小写字母。例子

您想要的是从解析数字的第一个实例中删除所有内容。要匹配一个数字,请使用 \d。要匹配任何字符,请使用 . 要匹配 0 个或多个前面的令牌,请使用 *. 这是一个贪心匹配,在满足下一个标记之前会匹配尽可能多的字符。

如果我们结合 .* 这将匹配以下所有内容。

把它放在一起 /\d.*/ 应该可以做到这一点。解决方案

然后

preg_replace("/\d.*/", "", $cell); 
于 2013-09-03T20:22:26.213 回答