preg_replace - 相似的模式

preg_replace - similar patterns

我有一个包含类似 "LAB_FF, LAB_FF12" 的字符串,我正在尝试使用 preg_replace 来查找这两种模式,并使用模式匹配将它们替换为不同的字符串;

/LAB_[0-9A-F]{2}|LAB_[0-9A-F]{4}/

所以输入是

LAB_FF, LAB_FF12

并且输出需要是

DAB_FF, HAD_FF12

问题是,对于第二个字符串,它将其解释为 "LAB_FF" 而不是 "LAB_FF12",因此输出是

DAB_FF, DAB_FF

我尝试使用 2 个不同的 preg_match 语句将输入行拆分出来,第一个查找 {2} 模式,第二个查找 {4} 模式。这种工作方式是我可以将正确的输出输出到 2 个单独的字符串中,但不能将这两个字符串组合起来给出单个修改后的输出。

您可以在一组花括号中指定确切的数量,例如`{2,4}.

刚刚测试过,似乎有效:

/LAB_[0-9A-F]{2,4}/
LAB_FF, LAB_FFF, LAB_FFFF

编辑:我的错误,实际上是在 2 和 4 之间匹配。如果您更改选择的顺序,它将与第一个匹配,例如

/LAB_([0-9A-F]{4}|[0-9A-F]{2})/
LAB_FF, LAB_FFFF

EDIT2:以下将匹配 LAB_even_amount_of_characters

/LAB_([0-9A-F]{2})+/
LAB_FF, LAB_FFFF, LAB_FFFFFF...

\b是字界。这意味着它将查看单词结束的位置,而不仅仅是模式匹配。

https://regex101.com/r/upY0gn/1

$pattern = "/\bLAB_[0-9A-F]{2}\b|\bLAB_[0-9A-F]{4}\b/";


看到另一个答案关于如何替换字符串的评论。
这是一种方式。

该模式将为每个失败的模式在输出数组中创建空条目。
在这种情况下,一个(第一个)。
那么这只是substr的问题。

$re = '/(\bLAB_[0-9A-F]{2}\b)|(\bLAB_[0-9A-F]{4}\b)/';
$str = 'LAB_FF12';

preg_match($re, $str, $matches);

var_dump($matches);

$substitutes = ["", "DAB", "HAD"];

For($i=1; $i<count($matches); $i++){
    If($matches[$i] != ""){
         $result = $substitutes[$i] . substr($matches[$i],3);
         Break;
    }
}

Echo $result;

https://3v4l.org/gRvHv