获取可选冒号前的所有字母

时间:2013-09-03 19:57:41

标签: php regex

我有一个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 个答案:

答案 0 :(得分:3)

匹配数字而不是可选冒号,然后匹配

之后的所有内容
preg_replace("/\d:?.*/", "", $cell); 

或者就像linepogl指出的那样

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

只要图案保留:字母数字everythingelse

答案 1 :(得分:2)

尝试:

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

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

regex101 demo

答案 2 :(得分: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;
}

答案 3 :(得分:0)

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

您的REGEX说要将数组[A-Za-z]中的非字符(由^表示)替换为大写字母或小写字母。 Example

你想要的是从第一个实例解析数字的地方删除所有内容。 要匹配数字,请使用\ d。 匹配任何角色使用。 要匹配前面标记中的0个或多个,请使用*。这是一个贪婪的匹配,在满足下一个标记之前将匹配尽可能多的字符。

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

把它放在一起/\d.*/应该完成这个。 Solution

然后

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