Php 带欧元符号的正则表达式

Php 带欧元符号的正则表达式,php,regex,arrays,Php,Regex,Arrays,我正在使用正则表达式从HTML页面获取一些价格。我有英镑和美元的工作字符串,但一旦我将其更改为欧元,并将货币符号放在正则表达式字符串的末尾,它似乎就不起作用了 这是我的代码:preg\u match('/([0-9]+[\.]*[0-9]*)\€/',$totalprice,$value) 然而,$value返回一个空数组 谢谢 这似乎是编码的问题。如果可以接受,请尝试仅为正则表达式使用货币unicode符号 $totalprice = "595,95€"; preg_match('/((?:[

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

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

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


谢谢

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

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

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

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

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

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

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

preg_match('/([0-9]+[\.]*[0-9]*)\€/u', $totalprice, $value);
                                   ^
                                add this
我会用这个正则表达式: 为了便于阅读,我将
/
替换为
#


正则表达式的部分解释:

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

  • [\.\,]
    匹配
    作为十进制分隔符

  • *?
    使*变为惰性,因此引擎首先尝试跳过前一项,然后再尝试与前一项不断增加的匹配项进行排列

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


修饰符的意思是:

  • s
    匹配所有字符,包括换行符
  • i
    匹配无大小写(不区分大小写)
  • u
    将模式字符串视为UTF-8(对于欧元符号)
我会使用这个正则表达式: 为了便于阅读,我将
/
替换为
#


正则表达式的部分解释:

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

  • [\.\,]
    匹配
    作为十进制分隔符

  • *?
    使*变为惰性,因此引擎首先尝试跳过前一项,然后再尝试与前一项不断增加的匹配项进行排列

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


修饰符的意思是:

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

它也可以是html特殊字符
&euro
@MikeBell检查我对你的问题的评论。简言之:您的php脚本需要保存为UTF-8编码。如果有帮助,下面是我想要得到的:XXXX,XX€
啊哈!我在您的正则表达式中看到一个输入错误:
未找到,因为源代码包含
作为十进制分隔符。相应地调整您的正则表达式,例如
([0-9]+[\.\,]*[0-9]*)\p{Sc}
@DanielGimenez您的答案很好,我没有直接回复。我应该在我的评论中加上@MikeBell。它也可能是一个html特殊字符
&euro
@MikeBell检查我对你的问题的评论。简言之:您的php脚本需要保存为UTF-8编码。如果有帮助,下面是我想要得到的:XXXX,XX€
啊哈!我在您的正则表达式中看到一个输入错误:
未找到,因为源代码包含
作为十进制分隔符。相应地调整您的正则表达式,例如
([0-9]+[\.\,]*[0-9]*)\p{Sc}
@DanielGimenez您的答案很好,我没有直接回复。我应该在我的评论中加上@MikeBell。你是否保存文件UTF-8编码(没有BOM)?IDE中应该有一个设置。只有使用正确的编码,才能正确保存纯欧元符号。否则使用
&欧元如建议的那样。顺便问一下:在您正在爬行的源中,空格是否出现在欧元符号之前?如果是,请在正则表达式中添加
\s
。例如
/(\d+\.*\d*)\s?[€]/siu
。是否保存UTF-8编码的文件(无BOM)?IDE中应该有一个设置。只有使用正确的编码,才能正确保存纯欧元符号。否则使用
&欧元如建议的那样。顺便问一下:在您正在爬行的源中,空格是否出现在欧元符号之前?如果是,请在正则表达式中添加
\s
。例如,
/(\d+\.*\d*)\s?[€]/siu
。如果模式中没有字母字符,他为什么要使用
i
修饰符?如果euro
符号已编码或类似
&euro它可能在源代码中的不同情况下,例如
&Euro
&欧元。这就是我把它包括在内的原因。很公平,但是你的模式不寻找实体字符串,只寻找符号。(哦,实体是区分大小写的-
Ö;
不同于
Ö;
。我认为欧元符号必须都是小写的
&Euro;
)@Spudley你说得对。我已经创建了一个与€版本。如果模式中没有字母字符,他为什么要使用
i
修饰符?如果euro
符号已编码或类似于
&euro它可能在源代码中的不同情况下,例如
&Euro
&欧元。这就是我把它包括在内的原因。很公平,但是你的模式不寻找实体字符串,只寻找符号。(哦,实体是区分大小写的-
Ö;
不同于
Ö;
。我认为欧元符号必须都是小写的
&Euro;
)@Spudley你说得对。我已经创建了一个与€版本