2011-01-06 8 views
3

私はこの権利を持っていると思うが、誰かにそのことを確認してもらいたい。

preg_replaceを正しく使用していますか(PHP)?

function storageAmmount() 
{ 
    system('stat /web/'.$user."/ | grep Size: > /web/".$user."/log/storage"); 
    $storage = fopen('/web/'.$user.'/log/storage'); 
    $storage = str_replace('Size:', " ", $storage); 
    $storage = preg_replace('Blocks:(((A-Z), a-z), 1-9)','',$storage); 
} 

これは、テキストファイルの行です:ワードサイズ:および他のすべてがuslessです:私はちょうど数値進行「サイズ」を取得しようとしています

Size: 4096  Blocks: 8   IO   Block: 4096 directory 

私に。

私は主にpreg_replaceを見ています。それはちょうど私ですか、正規表現はちょっと混乱していますか?何かご意見は。事前に助けてくれてありがとう。

乾杯!

フィル


[OK]を、ここで

は、機能が今のように見えるものです:私はをnumber_formatを置く

function storageAmmount() 
{ 
$storage = filesize('/web/'.$user.'/'); 
$final = $storage/(1024*1024*1024); 
return $final; 
} 

()、私はそれが方程式に入るのか、それとも返信になるのか本当に分かりません。私はそれが返されるすべてが "0.00"であることを両方ともに確かめました。

V1。

function storageAmmount() 
{ 
$storage = filesize('/web/'.$user.'/'); 
$final = number_format($storage/(1024*1024*1024), 2); 
return $final; 
} 

またはV2。

function storageAmmount() 
{ 
$storage = filesize('/web/'.$user.'/'); 
$final = $storage/(1024*1024*1024); 
return number_format($final, 2); 
} 

両方とも「0.00」を返します。何かご意見は?

+1

を使用することができますあなたはを見てみる必要があります[ PCRE構文リファレンス](http://php.net/manual/en/reference.pcre.pattern.syntax.php)を参照してください。 – BoltClock

+0

そして[編集ヘルプ](http://stackoverflow.com/editing-help)。コードの書式設定は、4つのスペースだけでインデントされます。 –

答えて

3

ファイルのサイズをバイト単位で取得しようとしているようです。もしそうなら、PHPのfilesize関数を使って、引数としてファイル名をとり、バイト単位でファイルのサイズを返してください。

function storageAmmount(){  
    $storage = filesize('/web/'.$user); 
} 
+0

ありがとうございます。私はそれが存在するとは思わなかった。しかし別の簡単な質問.... \t \t $ final = $ storage /(1024 * 1024 * 1024);これは正しいですか? \t \t return number_format($ final、2); スクリーンショット:http://grab.by/8eab –

0

あなたは

$storage = preg_replace('Block:.*','',$storage) 

を試してみましたか?シングル -

はさらに良いことに留意して

+1

デリミタを忘れました。 – BoltClock

+1

デリミタも必要であると確信しています。この場合、私は '%'を使いました。 'preg_match("%Size:([0-9] *)。*% "、$ storage、$ matches)' – Dan

1

ベアリング(私のマシン上でテスト)あなたはすでに(かなりなぜ取得しない文字列操作を使用しているという事実を

function storageAmmount() 
{ 
    exec('stat /web/'.$user.'/ | grep Size:',$output); 
    preg_match("/Size: ([0-9]*).*/",$output[0],$matches); 
    return $matches[1]; 
} 

を使用することです正規表現はそれをすべて処理できます)、私はあなたがなぜこの道を進まないのか分かりません。ちなみに

function storageAmount($user) { 
    system(escapeshellcmd('stat /web/'.$user.'/ | grep Size: > /web/'.$user.'/log/storage')); 
    $storageChunks = explode(' ', file_get_contents('/web/'.$user.'/log/storage')); 
    return $storageChunks[1]; 
} 

: - あなたはそれを引数として渡す必要があるのいずれか

  1. $ユーザー変数は、あなたの関数のスコープ内に存在しない爆発使っ例えば

    私がやったように、それをグローバルにする。

  2. あなたは本当にあなたは間違ってはfopenを使用している

  3. など、システム/ EXECに渡されるすべてのコマンドにescapeshellcmdを使用する必要があります。fopenは、fcloseを使う前にfreadなどから読み込む必要があるリソースを返します。つまり、私はこれをfile_get_contentsと置き換えました。これはあなたのためにオープン/リード/クローズを行います。

  4. システムコマンドで何をしようとしているのか分かりませんが、そのまま残しました。しかし、ファイルに出力するのではなく、最後の文字列出力として直接grepの結果を得ることができます。 (これはsystemコマンドが返すものです)また、文字列区切り文字として 'と'を混在させている - これは機能しません(ただ一貫して使用してください)。

  5. 実際にはそうでなければ、常に値に4096

2

を返すことでしょうとして「df --si /web/'.$user.'/'」コマンドはありません、あなたが適切preg_replaceを使用していない

を誤解の多くはあなたのコードにあります;。訂正しますそれは私がホの基礎を説明しなければならないことを意味するだろうw Regexは動作します。私は実際には、いくつかのプライマーを読むことをお勧めします。あなたはstr_replaceと、ここで何をしようとして、http://www.regular-expressions.info/実際に

と一緒preg_replaceは、より良い単一preg_matchを使用して達成されるであろう:そこここに良いものです。このような

何かがトリックを行うだろう:

$matches = preg_match('/Size: (\d+)/',$storage); 
$storage = $matches[1]; 

(\d+)は、任意の桁数をピックアップし、$マッチ配列の要素にそれらを置きます。 Size:を入力すると、入力文字列のSize:の直後にある数字だけが認識されます。

説明した方法で入力文字列が一貫してフォーマットされている場合は、preg_関数をまったく使用せずに行うこともできます。スペース文字の上にちょうどexplode()と2番目の要素を拾う。正規表現は必要ありません。

2

正規表現の最良の使い方は

// preg_match solution  
$storage = 'Size: 4096 Blocks: 8 IO Block: 4096 directory'; 
if (preg_match('/Size: (?P<size>\d+)/', $storage, $matches)) { 
    return matches['size']; 
} 

あるしかし、あなたはとlocalYそれをやっている場合、あなたは、PHPの関数番目stat

// php stat solution 
$f = escapeshellcmd($user); 
if ($stat = @stat('/web/'.$f.'/log/storage')) { 
    return $stat['size']; 
} 
関連する問題