2011-01-06 59 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); 
} 

这是在文本文件中的行:

Size: 4096  Blocks: 8   IO   Block: 4096 directory 

我想要得到的只是数值的收益“大小”,字的大小:和其他一切是usless对我来说。

我主要看preg_replace。这只是我还是正则表达式有点混乱?有什么想法吗。感谢您提前提供任何帮助。

干杯!

菲尔


好吧,

下面是函数的样子现在:

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

我会放在哪里number_format()我不确定是否会出现在方程式或回归声明中。我已经在它所有它返回是“0.00”tred它。

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 2011-01-06 12:21:06

+0

和[编辑帮助](http://stackoverflow.com/editing-help)。格式化代码只是4个空格的缩进。 – 2011-01-06 12:29:23

回答

3

看起来你正试图获得在字节文件的大小。如果是这样,为什么不直接使用PHP的filesize函数,它接受文件名作为参数,并返回字节的文件大小。

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

你试过

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

更妙的是使用

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

(我的机器上测试)

+1

你忘了分隔符。 – BoltClock 2011-01-06 12:30:39

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. 你真的应该使用escapeshellcmd传递到系统/ EXEC所有命令等

  3. 您使用的fopen不正确。fopen在使用fclose之前返回一个资源,然后你需要通过fread等来读取资源。这就是说,我已经与file_get_contents这确实开这个替代/读取/关闭你。

  4. 我真的不知道你试图用系统命令做什么,但我把它原样。但是,您可以直接将grep的结果作为最后一个字符串输出,而不必将其输出到文件。 (这是system命令返回的内容。)您还将'和“混合为字符串分隔符 - 这将不起作用(只要使用一个即可)。

  5. 我怀疑您实际上是想要最后一行“df --si /web/'.$user.'/'”命令,否则你将永远返回值4096

2

不,你没有使用正确preg_replace

有没有在你的代码的误解的很多;纠正这将意味着我不得不解释何的基本知识w正则表达式的作品。我真的推荐阅读关于这个主题的一些引文。有一个很好的位置:http://www.regular-expressions.info/

事实上,你想在这里与str_replace做什么和preg_replace共同使用单一preg_match更好地实现。

像这样的事情会做的伎俩:

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

(\d+)选秀权的任何数量的数字,并将它们放入一个元素在$匹配阵列。把Size:在迫使它只能识别尺寸后是数字面前:在你输入的字符串。

如果您输入字符串一致的格式在您所描述的方式,你也可以做到这一点,而无需使用任何preg_功能可言;只需explode()上的空格字符,并拿起第二个元素。不需要正则表达式。

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