我正在尝试用混合法语(加拿大语)和英语的文本解析美元金额。该文本采用UTF-8格式。他们使用$ C来表示货币。出于某种原因,当我使用preg_match时,既不能找到'$'也不能找到'C'。其他一切都很好。有什么想法吗?
e.g。使用
preg_match_all('/\$C/u', $match)
在“感谢支付46,00 $ C”返回空。
答案 0 :(得分:2)
我认为正则表达式找不到那些字符,因为它们不在那里。如果你这样初始化字符串:
$source = "Thanks for a payment of 46,00 $C";
...(即,作为双引号字符串文字),$C
被解释为变量名。由于您从未初始化那个变量,因此实际字符串中的任何内容都不会被替换。您应该使用单引号来初始化字符串,或者像在正则表达式中那样用反斜杠转义美元符号。
顺便说一下,这可能不是编码问题,因为(在该示例中,至少),所有字符都来自ASCII字符集。无论是编码为UTF-8,ISO-8859-1还是ASCII,字符串的二进制表示都是相同的。
答案 1 :(得分:0)
preg_match_all('/\$C/u', 'Thanks for a payment of 46,00 $C', $matches);
print_r($matches);
对我来说很好:
Array
(
[0] => Array
(
[0] => $C
)
)
答案 2 :(得分:0)
也许这会有所帮助:
// assuming $text is the input string
$matches = array();
preg_match_all('/([0-9,\\.]+)\\s*\\$C/u', $text, $matches);
if ($matches) {
$price = floatval(str_replace(',', '.', $matches[1][0]));
printf("%.2f\n", $price);
} else {
printf("No price found\n");
}
确保输入字符串($text
)已正确解码为Unicode字符串。 (例如,如果它是UTF-8,请使用utf8_decode
函数。)