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;
我有一个包含类似 "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;