【问题标题】:compare two price strings in php with regex将php中的两个价格字符串与正则表达式进行比较
【发布时间】:2026-01-31 16:40:02
【问题描述】:

假设我们有两个不同格式的价格字符串:

$s_price = '85.95' or '1500.00'
$r_price = '$ 85.95' or '1,500'

但所有这些价格都是相同的,应该匹配。

我有一个正则表达式可以做到这一点,但不知道我们是否这样做:

(\d+)*(,)?\d+(.)?\d*

【问题讨论】:

  • 您不应将价格存储为字符串。将它们存储为整数(或小数,如果需要),并以不同的方式显示。
  • Qirel 的 +1,如果你没有选择并且不能使用 int 一些正则表达式应该根据你可以获得的所有类型的字符串来完成这项工作
  • “这是我从 API json 接收的方式” - 什么决定了 API 的格式?是否有一些本地化标志或其他东西?还是 API 只是随机返回不同的格式(这会很糟糕)?

标签: php regex string


【解决方案1】:

要在 PHP 中从字符串中检索和解析浮点数,请使用 floatval() 方法。

对于符号,这取决于您是否始终对货币使用相同的约定(逗号表示千位分隔符,点表示小数)。在这种情况下,您应该使用preg_replace() 方法删除除点之外的非数字(对应的正则表达式可以是/[^0-9.]/

<?php

function sanitize($price) {
    return floatval(preg_replace('/[^0-9.]/', '', $price));
}

$a1 = '85.95';
$a2 = '1500.00';
$b1 = '$ 85.95';
$b2 = '1,500';

sanitize($a1); // (float) 85.95
sanitize($a2); // (float) 1500
sanitize($b1); // (float) 85.95
sanitize($b2); // (float) 1500

sanitize($a1) === sanitize($b1); // (bool) true
sanitize($a2) === sanitize($b2); // (bool) true
sanitize($a1) <= sanitize($a2); // (bool) true
sanitize($b1) >= sanitize($b2); // (bool) false

希望对您有所帮助!

【讨论】:

  • 您将如何在字符串$ 85.951,500 上成功使用floatval()?发布答案时,您应该包括一些关于 OP 应该如何做的例子。这是一个“仅限链接”的答案,在这里不受欢迎。
  • 好吧,在这种情况下,我认为您别无选择,只能使用正则表达式。
  • ...这意味着这并不能真正回答问题:-)
  • 我正在编辑我的回复,真的有必要否决我吗?我是新来的,我想帮忙.....
  • 如果答案不能回答问题,那么是的,有必要对答案投反对票。这就是向上/向下投票按钮的用途。在发布之前,每个用户都必须确保答案确实有效,否则我们会得到大量毫无帮助的答案。
【解决方案2】:

您的模式中有很多使用 ?* 的可选部分,如果您没有在代码中引用它们,则可以省略捕获组。

您可以做的是匹配美元符号的可选部分,后跟 0+ 个水平空白字符。

然后匹配 1+ 个数字,后跟一个可选部分以匹配点或逗号和 1+ 个数字:

(?<!\S)(?:\$\h*)?\d+(?:[,.]\d+)\b

说明

  • (?&lt;!\S) 断言左边不是非空白字符
  • (?:\$\h*)? 可选择匹配一个美元符号和 0+ 个水平空白字符
  • \d+(?:[,.]\d+) 匹配 1+ 个数字,后跟可选部分以匹配点或逗号以及 1+ 个数字
  • \b 字边界以防止数字成为更大字的一部分

Regex demo | Php demo

【讨论】:

    【解决方案3】:

    您将数字存储为整数或浮点数
    并进行比较,您需要使用 ||不是或

    希望对你有帮助

    【讨论】:

    • 我们不知道 OP 是否可以控制 API。
    • 我觉得他的问题和我想的不一样