我有一个包含固定位置数据的文件(没有分隔符)。
例如:
$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");
但那不起作用。
如果我将空格替换为_
之类的其他字符,那可以,但我不想要更改数据。
另一个想法?正则表达式?
答案 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})