我需要一个从£和£开始的整数值,我尝试使用regrex,但我只获得从£开始的价值。
我在这里使用像这样的regrex。
if(preg_match('/(\£[0-9]+(\.[0-9]{2})?)/',$vals,$matches))
{
$main[]= str_replace('£','',$matches[0]);
}
我对regrex并不熟悉。所以请分享任何解决方案。任何帮助都会高度赞赏。谢谢。
答案 0 :(得分:3)
根据您的问题,我了解到您在使用字符编码方面遇到了麻烦,因此首先我建议您先解决此问题,因此解决编码问题非常重要非常尽可能早的一步。
回到问题,首先,为了避免陷入字符集编码地狱的深层次,我建议你在HEX中编写你的正则表达式文字,因为否则你保存PHP文件的字符集编码会影响结果。 I.E.如果你做这样的事情:
preg_match('/(£|£)(\d+)', ...)
匹配“£”和“£”(二进制)如果您将源代码保存在ISO-8859-1中,但它实际上会匹配“如果您选择以UTF-8保存源代码(通常可能是一个好主意),则使用“和”,“二进制”。所以要小心这一点,并验证编辑器/ IDE正在做什么!
我的建议是这样写,这相当于ISO-8859-1和UTF-8:
preg_match('/(\xa3|\xc2\xa3)(\d+)', ...) // match "£" and "£"
另外我建议使用正则表达式的子模式捕获功能,所以之后你不必使用str_replace(),这样:
if (preg_match('/(?:\xa3|\xc2\xa3)([0-9]+(?:\.[0-9]{2})?)/', $data, $regp)) {
$main[] = $regp[1];
}
“?”之后的“(”表示“这是一个子模式,但不捕获它”。
请注意,你也可以用preg_match_all替换preg_match,你会在$ regp [1]中找到已经准备好的所有匹配数字的数组。
答案 1 :(得分:0)
尝试使用此修改后的正则表达式:
(?:£|£)([0-9]+(\.[0-9]{2})?)
它应该做的伎俩。但它也会返回十进制值,因为: ([0-9] {2})?
你可以删除它,它只返回£|£
之后的整数部分