【问题标题】:preg_replace - similar patternspreg_replace - 类似的模式
【发布时间】:2017-07-28 17:09:24
【问题描述】:

我有一个包含“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 个单独的字符串,但不能将这两个字符串组合起来给出单个修改后的输出。

【问题讨论】:

  • 显示你用来替换东西的代码。
  • 这里发布的答案有什么问题吗?如果有问题请告诉我,以便我修复它。

标签: php preg-replace preg-match


【解决方案1】:

\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

【讨论】:

    【解决方案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...
    

    【讨论】:

    • 干杯,这似乎有效。有什么想法可以执行 preg_replace 以便“LAB_FF”被“X”替换,“LAB_FFFF”被“Y”替换?
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多