【问题标题】:Preg_replace_callback regex doesnt work correctlyPreg_replace_callback 正则表达式无法正常工作
【发布时间】:2013-11-27 16:25:59
【问题描述】:
      $input = array("3.45Lt", "1.00€");
function kazkas($match){
    if($match[3]==="LTL"){
        $match[3] = "EUR";
    }
    elseif($match[3]==="Lt" | $match[3]==="LT" | $match[3]==="lT" |$match[3] === "lt"){
        $match[3] = "€";
    }else{
        $match[3]=$match[3];
    }
    $changeratio = 3.4488;
    return  number_format($matchn[1]/$changeratio,2).$match[2].$match[3];
    //3.4492
}
$result = preg_replace_callback('/(\d+[,.]?\d?)(\s?)(L+T+L?)/iD','kazkas',$input);
var_dump($result);

我想查找所有带有 LT 或 LTL 的数字并转换为欧元也更改货币徽标。

为什么 preg_replace_callback 不需要 3.45 ?r 它需要 3 比 45 和 var_dump 显示:

 数组(大小=2)
  0 => 字符串'3.13.05€'(长度=10)
  1 => 字符串“1.00”(长度=7)
我尝试使用 preg_replace 测试正则表达式,它返回良好的 3.45。 preg_replace_callback 有什么问题。我的正则表达式不好吗?

【问题讨论】:

  • 是原始代码中的$matchn[1] 错字还是这里的复制错误?
  • 你的正则表达式只允许小数点后1位,但你的例子有2位。
  • 你说得对:D,谢谢......

标签: php regex


【解决方案1】:

你的正则表达式有点不对劲。由于您没有锚点^$,因此匹配可以在字符串中的任何位置开始。在第一个示例中实际匹配的只是45Lt,这会给您带来各种问题。

您还有 $matchn[1] 而不是 $match[1],但这似乎只是一个错字。

/^(\d+[,.]?\d*)(\s?)(L+T+L?)$/i

我不确定在LT 之后是否需要+

【讨论】:

  • 在我的程序中 $match[1] 是正确的,我想我确实犯了复制/粘贴错误。但问题出在 \d? 中。 \d+ 修复了它。
  • @DonatasVileita \d+ 需要十进制数字。 \d* 允许 0 个或多个