【问题标题】:Regex with EURO symbol [duplicate]带有欧元符号的正则表达式 [重复]
【发布时间】:2013-08-08 14:49:25
【问题描述】:

我正在使用正则表达式从 HTML 页面中获取一些价格。我有 £ 和 $ 的工作字符串,但是一旦我将其更改为欧元并将货币符号放在正则表达式字符串的末尾,它似乎不起作用。

这是我的代码:preg_match('/([0-9]+[\.]*[0-9]*)\€/', $totalprice, $value);

然而 $value 返回一个空数组。

谢谢!

【问题讨论】:

  • 您是否保存文件UTF-8 编码(无BOM)?您的 IDE 中应该有一个设置。只有使用正确的编码,plain 符号才能正确保存。否则按照建议使用€
  • 顺便说一句: 在您正在抓取的来源中,€ 符号之前是否有空格?如果是这样,请在正则表达式中添加 \s。例如。 /(\d+\.*\d*)\s?[€]/siu.

标签: php regex arrays


【解决方案1】:

这似乎是编码的问题。如果可以接受,请尝试仅对正则表达式使用货币 unicode 符号。

$totalprice = "595,95€";
preg_match('/((?:[0-9]*[.,])?[0-9]+)\p{Sc}/u', $totalprice, $value);
print_r($value);

phpFiddle

【讨论】:

  • 也可以是html特殊字符€
  • @MikeBell 检查我对您问题的评论。 简而言之: 您的 php 脚本需要以 UTF-8 编码保存。
  • 如果有帮助,这就是我想要得到的:

    XXXX,XX€

  • 啊哈! 我在您的正则表达式中看到一个错字:. 未找到,因为源包含 , 作为小数分隔符。相应地调整您的正则表达式,例如([0-9]+[\.\,]*[0-9]*)\p{Sc}.
  • @DanielGimenez 你的回答很好,我没有直接回复。我应该把 @MikeBell 放在我的评论中。
【解决方案2】:

u 修饰符添加到正则表达式字符串的末尾,告诉它接受 unicode 字符。

preg_match('/([0-9]+[\.]*[0-9]*)\€/u', $totalprice, $value);
                                   ^
                                add this

【讨论】:

    【解决方案3】:

    我会使用这个正则表达式:

    '#(\d+[\.\,]\d*?)\s?[€]#su'
    

    为了便于阅读,我将 / 替换为 #

     
    部分正则表达式解释:

    • \d           匹配数字(等于 [0-9],只是更短)

    • [\.\,] 匹配., 作为小数分隔符

    • *?           使 * 变得懒惰,因此引擎首先尝试跳过前一项,然后再尝试                  排列与前一项的匹配度不断增加[1]

    • \s?         匹配空格字符(?使其可选)

     
    修饰符的意思是:

    • s 匹配所有字符,包括换行符
    • i   不区分大小写(不区分大小写)
    • u 将模式字符串视为 UTF-8 (用于 € 符号)

    【讨论】:

    • 如果模式中没有字母字符,他为什么需要i 修饰符?
    • 如果欧元 符号被编码或类似 € 它可能在源中的不同情况下,例如&Euro;€。这就是我包含它的原因。
    • 很公平,但是您的模式不寻找实体字符串,而只是寻找符号。 (哦,实体区分大小写 - Öö 不同。我认为欧元符号必须全部小写 €
    • @Spudley 你是对的。我创建了一个jsfiddle 来使用 €版本。
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 2020-04-11
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2012-01-15
    相关资源
    最近更新 更多