使用固定位置

时间:2017-03-09 14:46:12

标签: php regex optimization

我有一个包含固定位置数据的文件(没有分隔符)。

例如:

$string = '0412345678Mr foo    25.2';

code  = '04'       (integer with 2 characters)
ref   = '12345678' (string  with 8 characters)
name  = 'Mr foo  ' (string  with 8 characters)
price = '  25.2'   (double  with 6 characters)

我可以这样做:

$code  = (int) substr($string, 0, 2);
$ref   = substr($string, 2, 8);
$name  = substr($string, 10, 8);
$price = (double) substr($string, 18, 6);

工作正常。

我想知道是否有另一个人这样做。

我试试:

list($code, $ref, $name, $price) = sscanf($string, "%2d%8s%8s%6s");

但那不起作用。

如果我将空格替换为_之类的其他字符,那可以,但我不想要更改数据。

另一个想法?正则表达式?

1 个答案:

答案 0 :(得分:2)

正如您所提到的,您可以使用正则表达式。 以下是一个简单的例子:

([0-9]{2})([0-9]{8})([a-zA-Z ]{8})([0-9. ]{6})

https://regex101.com/r/2bS8af/1

添加http://php.net/manual/fr/function.preg-match.php后,可以解决问题。

然后,如果你想在变量中使用它们,只需通过取preg_match的输出来分配它们:)

<?php
$string = '0412345678Mr foo    25.2';

$pattern = '/([0-9]{2})([0-9]{8})([a-zA-Z ]{8})([0-9. ]{6})/';
preg_match($pattern, $string, $matches);
print_r($matches);

顺便说一句,您可以用&#34; \ d&#34;替换[0-9]。等...... 哪个可以给:

(\d{2})(\d{8})([\w\s]{8})([\d\s.]{6})

https://regex101.com/r/2bS8af/3