如何只获取整数值从符号给定的字符串开始

时间:2016-10-15 13:28:20

标签: php regex

我需要一个从£和£开始的整数值,我尝试使用regrex,但我只获得从£开始的价值。

我在这里使用像这样的regrex。

if(preg_match('/(\£[0-9]+(\.[0-9]{2})?)/',$vals,$matches))
{
$main[]= str_replace('£','',$matches[0]);
}

我对regrex并不熟悉。所以请分享任何解决方案。任何帮助都会高度赞赏。谢谢。

2 个答案:

答案 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})?

你可以删除它,它只返回£|£

之后的整数部分