2017-03-09 17 views
2

固定位置(セパレータなし)にデータを含むファイルがあります。 exempleため固定位置の文字列でデータを復元する

:それは仕事の罰金だ

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

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) 

$string = '0412345678Mr foo 25.2'; 

私はそれを行うことができます。

これを行う方法が他にあるかどうかを知りたいと思います。

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

しかし、それは動作しません:

は私がすることをしてみてください。

スペースを_のような別の文字に置き換えると、それは動作しますが、データを変更したくありません。

別のアイデアですか?正規表現?

+0

_Rule 10::与えることができる それがAINT破った場合は_には、それを修正いけません! – RiggsFolly

+0

あなたは言及したように正規表現を使用することでそれを行うことができます。 ([0-9] {2})([a-zA-Z] {8})([0-9。] {6}) 'https://(' regex101.com/r/2bS8af/1 – kaldoran

+0

@kaldoran:私はそれを試みますが、結果を変数に入れる方法がわかりません – doydoy44

答えて

2

あなたが言ったように、regexpを使用することができます。 http://php.net/manual/fr/function.preg-match.phpの追加により

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

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

、トリックを行うことができます: はここに働くだろう単純なものの一例です。あなたは、変数の簡単な内部のそれらをしたい場合は

その後する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); 

をところで、あなたは「\ dの」などで[0-9]を置き換えることができます。..

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

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

+0

ありがとう、私は 'preg_split'をテストしましたが' preg_match'はありませんでした – doydoy44

+0

問題はありません:) \ d、\ wなどを使って簡単なバージョンを追加しました:) – kaldoran

+0

THks very much :) – doydoy44

関連する問題