【问题标题】:replace exact match in php替换php中的完全匹配
【发布时间】:2009-07-03 09:06:48
【问题描述】:

我是 php 正则表达式的新手。

我有一些数据,其中一些值存储为零 (0)。我想做的是用“-”替换它们。我不知道哪个值会变为零,因为我的数据库表每天都会更新,这就是为什么我必须将替换的东西放在所有数据上。

$r_val=preg_replace('/(0)/','-',$r_val);

我使用的代码正在替换它找到的所有零,例如。它甚至将 104.67 中的零替换为错误的输出 1-4.56。我想要值精确为零的数据,必须用“-”代替它遇到的每个零。 谁能帮忙!!

$r_val 的值示例:-

10.31, 391.05, 113393, 15.31, 1000 等等。

【问题讨论】:

  • $r_val 的格式是什么?
  • $r_val 具有浮点类型值
  • 更新了我的解决方案。基本上是一样的,但它使用向前看和向后看来确保两边的 0 旁边没有句点。所以,5.0 和 0.5 都应该妥善保存。
  • 感谢 matthew 它解决了我的问题 =)

标签: php mysql regex


【解决方案1】:

这在很大程度上取决于您的数据在 $r_val 中的格式,但一个不错的起点是尝试:

$r_val = preg_replace('/(?<!\.)\b0\b(?!\.)/', '-', $r_val);

其中\b 是一个长度为 0 的字符,表示“单词”的开头或结尾。

这听起来很奇怪,但 Perl regex documentation 实际上非常适合解释 preg_* 函数的正则表达式部分,因为 Perl 是实际实现该功能的地方。

【讨论】:

  • 我不确定 \b 是否适用于数字,但显然确实如此。 :) 另一种模式可以使用前瞻和后瞻断言的组合。 '#(?
【解决方案2】:

同样,如果您能提供一个 $r_val 字符串的真实样子的示例,那将非常有帮助。

请注意,\b 匹配单词边界,这也会将类似“0.75”的字符串转换为“-.75”。我猜这不是一个理想的结果。

【讨论】:

  • 你是对的,它取代了我不想要的 o。我已经编辑了我的问题,您可以在那里查看 $r_val 所具有的值的示例
【解决方案3】:

虽然其他答案确实有效,但对我来说似乎过于复杂。我认为您只需要在 0 的任一侧使用 ^ 和 $ 字符。

$r_val = preg_replace('/^0+$/', '&#45', $r_val);
  • ^ 表示正则表达式应该从行首开始匹配。
  • $ 表示正则表达式应该匹配到行尾。
  • + 表示匹配此模式 1 次或多次

我也将减号更改为等效的 html 代码。偏执狂,是的,但我们毕竟是在处理数字,所以我认为在其中输入一个原始的减号可能不是最好的主意。

【讨论】:

  • 嘿,我不知道这是正则表达式的新手。感谢这段代码 Matw =)
【解决方案4】:

为什么不这样做呢?


if ( $r_val == 0 )
    $r_val = '-';

您不需要为此使用正则表达式。事实上,出于性能原因,我建议不要这样做。上述操作比正则表达式解决方案快大约 20 倍。

此外,PHP 手册建议不要使用正则表达式进行简单替换:

如果您不需要花哨的替换规则(如正则表达式),则应始终使用此函数而不是 ereg_replace() 或 preg_replace()。

http://us.php.net/manual/en/function.str-replace.php

希望有帮助!

【讨论】:

  • $r_val != 0 不过,从他所说的情况来看,它更有可能保持“5.0, 34.05, 23.4”
  • 他说:“我有一些数据,其中一些值存储为零(0)。我想做的是用'-'替换它们”所以存储的那些因为 0 (即 $rval == 0 )被更改为“-”,而其他人则不理会。不需要正则表达式。
  • 我同意,如果是这样的话,但是......如果是这样,那么他为什么首先要询问正则表达式?在知道正则表达式存在之前,人们肯定会学习 $rval == 0...
  • 也许有人建议他使用正则表达式,然后他来这里寻求帮助。我不知道。不过,鉴于他最初的问题,我的解决方案是足够且更快的。如果还有他没有提到的其他要求,那可能会改变。
  • 好吧,迈克,我没有任何其他要求,您在解决方案中提供的代码正是我之前所做的,但我被告知最好使用正则表达式,所以我选择了正则表达式。我不知道这个简单的代码比正则表达式更快。感谢信息人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多