【问题标题】:Regex expression works well when testing but not in my page正则表达式在测试时效果很好,但在我的页面中却不行
【发布时间】:2014-01-03 20:36:45
【问题描述】:

在 Regex 测试页面上进行测试时,下面的这个 Regex 适用于所有货币。

虽然在我的页面中,它只适用于美元货币。

我为不同的字符集更改了 MetaTag,没有运气。

可能出了什么问题?

if (preg_match_all('([£€$¥]([ 0-9]([ 0-9,])*)(\.\d{2})?|([0-9]([0-9,]))(\.\d{2})?([pcm]|bn| [mb]illion))', $tout, $matches))

我想提取 4 个货币符号中的任何一个(不带空格)之后的任何金额。

【问题讨论】:

  • 您能否展示一些您正在处理的$tout 的示例值?
  • 没有更多信息,我认为这是一个编码问题。您的表达式可能不匹配,因为您尝试匹配的文本中的其他货币符号使用的字符代码与脚本中的不同。如果输入是 UTF-8,请尝试将 u 修饰符添加到您的模式并确保您的脚本也是 UTF-8。
  • 这不会被提取:¥ 18.00 菠萝鸡
  • 这将被提取:$ 18.00 菠萝鸡
  • @SergeSf:你的页面使用什么编码并不重要,除非那是输入的来源。重要的是脚本本身和输入的编码。 (顺便说一句,如果您有选择,您可能更喜欢 UTF-8,原因有很多。)

标签: php regex currency


【解决方案1】:

您使用的表达式是有效的,并且似乎与预期的输出匹配。也就是说,如果文件保存为 UTF-8。

如果输入的编码不同,它将不起作用。此外,如果输入确实是 UTF-8 但源不是,则正则表达式似乎会失败,因为它会尝试匹配不同的字符(非 UTF-8 编码等价物)。

【讨论】:

  • 谢谢。我正在做。这是我的来源:€ 69.00 Repas complet hyper 69.00 Repas完成欧元符号没有出现,我想知道为什么(我认为这是问题所在)。我正在调查。
  • @SergeSf 是的,它确实有效ideone.com/2gFaJn :) 检查输入到达脚本的编码以及源文件的编码。
  • 嘿 Mikulas 非常感谢。我解决了我的问题,与编码无关,这是我的错误,我试图对提取的数字进行计算,但我忘了消除其他货币。很抱歉给您带来麻烦。这是我更正的部分:{ $tot1 = $matches[0]; $tot1 = preg_replace("/\\\$/", '', $tot1); $tot1 = preg_replace("/\€/", '', $tot1); $tot1 = preg_replace("/\¥/", '', $tot1); $tot1 = preg_replace("/\£/", '', $tot1);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
相关资源
最近更新 更多