2011-01-06 16 views
3

Ich denke, ich habe das Recht, aber ich möchte, dass jemand das überprüft. Diese

Benutze ich preg_replace korrekt (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); 
} 

ist die Zeile in der Textdatei:

Size: 4096  Blocks: 8   IO   Block: 4096 directory 

Ich versuche nur, den numerischen Wert erhalten die Erlöse „Größe:“ das Wort Größe: und alles andere ist usless mir.

Ich schaue hauptsächlich auf die preg_replace. Ist es nur ich oder ist Regex ein bisschen verwirrend? Irgendwelche Gedanken. Danke für jede Hilfe im Voraus.

Prost !,

Phill


Ok,

Hier ist, was die Funktion jetzt aussieht:

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

Wo würde ich die number_format put(), Ich bin mir nicht wirklich sicher, ob es in die Gleichung oder in die Rückkehrerklärung eingehen würde. Ich habe es in beiden und alles, was es zurückgibt, ist "0.00".

V1.

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

oder V2.

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

weder funktionieren und sie beide zurück "0.00". Irgendwelche Gedanken?

+1

Sie ergreifen müssen, um einen Blick auf die Verwendung th [ PCRE-Syntaxreferenz] (http://php.net/manual/en/reference.pcre.pattern.syntax.php). – BoltClock

+0

Und die [Hilfe bearbeiten] (http://stackoverflow.com/editing-help). Formatierungscode ist nur um 4 Leerzeichen eingerückt. –

Antwort

3

Sieht aus, als ob Sie versuchen, die Größe der Datei in Bytes zu erhalten. Wenn ja, warum nicht einfach die filesize-Funktion von PHP verwenden, die den Dateinamen als Argument akzeptiert und die Größe der Datei in Byte zurückgibt.

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

Danke dafür. Ich habe nicht gedacht, dass es existiert. aber noch eine kurze Frage .... Ist dies korrekt: \t \t $ final = $ speicher/(1024 * 1024 * 1024); \t \t returnnummer_format ($ final, 2); Bildschirmpräsentation: http://grab.by/8eab –

0

haben Sie

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

?

Noch besser wäre

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

(getestet auf meinem Rechner)

+1

Sie haben die Trennzeichen vergessen. – BoltClock

+1

Ich bin mir ziemlich sicher, dass Sie auch Trennzeichen benötigen, in diesem Fall habe ich '%'; 'preg_match ("% Größe: ([0-9] *). *% ", $ Speicher, $ Übereinstimmungen)' – Dan

1

Unter Berücksichtigung der Tatsache zu nutzen, dass Sie bereits String-Manipulation unter Verwendung von (nicht ganz bekommen, warum - ein einzigen Regulärer Ausdruck könnte damit umgehen), ich weiß nicht, warum Sie diesen Weg nicht weitergehen.

Zum Beispiel explodieren mit:

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]; 
} 

Übrigens:

  1. Die $ user Variable existiert nicht im Rahmen Ihrer Funktion - Sie müssen entweder als Argument übergeben in wie ich es getan habe, oder es zu einem globalen machen.

  2. Sie wirklich escapeshellcmd auf alle Befehle weitergegeben System/exec verwenden sollen usw.

  3. Sie verwenden falsch FOPEN.fopen gibt eine Ressource zurück, die Sie dann vor der Verwendung von fclose auslesen müssen. Das heißt, ich habe dies durch file_get_contents ersetzt, die das Öffnen/Lesen/Schließen für Sie erledigt.

  4. Ich bin nicht wirklich sicher, was Sie mit dem Systembefehl versuchen, aber ich habe es wie es ist verlassen. Sie können jedoch das Ergebnis von grep direkt als letzte Zeichenfolge zurückgeben, anstatt es in eine Datei ausgeben zu müssen. (Dies ist, was der system Befehl zurückgibt.) Sie mischen auch "und" als String-Trennzeichen - das wird nicht funktionieren. (Verwenden Sie nur eins konsistent.)

  5. Ich vermute, Sie wollen eigentlich die letzte Zeile von „df --si /web/'.$user.'/'“ Befehl als sonst werden Sie immer den Wert zurückkehren 4096.

2

Nein, Sie verwenden nicht preg_replace richtig

Es gibt eine viel von Missverständnissen in Ihrem Code;. zu korrigieren Es würde bedeuten, dass ich die Grundlagen von ho erklären müsste w Regex funktioniert. Ich empfehle wirklich ein paar Primer zu diesem Thema zu lesen. Es ist ein guter hier: http://www.regular-expressions.info/

In der Tat, was Sie versuchen, hier mit den str_replace zu tun und die preg_replace besser zusammen mit einem einzigen preg_match erreicht werden würde.

So etwas wie dies tun würde, den Trick:

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

Die (\d+) nimmt eine beliebige Anzahl von Ziffern und setzt sie in ein Element in der $ array übereinstimmt. Putting Size: vor dem zwingt es nur die Ziffern zu erkennen, die unmittelbar nach Größe sind: in Ihrer Eingabe-Zeichenfolge.

Wenn Ihre Eingabezeichenfolge in der von Ihnen beschriebenen Weise konsistent formatiert ist, können Sie sie auch ohne die Verwendung von preg_-Funktionen ausführen. nur explode() auf ein Leerzeichen und holen Sie das zweite Element. Keine Regex erforderlich.

2

Die beste Verwendung von Regex ist

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

Aber wenn Sie es localy tun, können Sie PHP-Funktion stat

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