preg_replace - 类似模式

时间:2017-07-28 17:09:24

标签: php preg-replace preg-match

我有一个包含类似“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 个答案:

答案 0 :(得分:0)

您可以在一组花括号中指定精确数量,例如`{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...

答案 1 :(得分:0)

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

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

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

<小时/>

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

模式将在输出数组中为每个失败的模式创建空条目 在这种情况下一个(第一个) 然后它只是一个子问题。

$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