我需要在一组文件中更新同一行,其中还包括dd/mm/yyyy
格式的日期以及一些字符串。我已经在这里检查了类似问题的答案,但无法在我的代码中运行任何建议的模式。
我目前的PHP代码是:
<?php
// get the system date
$sysdate = date("d/m/Y");
// open the directory
$dir = opendir($argv[1]);
$files = array();
// sorts the files alphabetically
while (($file = readdir($dir)) !== false) {
$files[] = $file;
}
closedir($dir);
sort($files);
// for each ordered file will run the in the clauses part
foreach ($files as $file) {
$lines = '';
// filename extension is '.hql'
if (strpos($file,".hql") != false || strpos($file,".HQL") != false)
{
$procfile = $argv[1] . '\\' . $file;
echo "Converting filename: " . $procfile . "\n";
$handle = fopen($procfile, "r");
$lines = fread($handle, filesize($procfile));
fclose($handle);
$string = $lines;
// What are we going to change runs in here
$pattern = '[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]';
$replacement = $sysdate;
$lines = preg_replace($pattern, $replacement, $string);
echo $lines;
$newhandle = fopen($procfile, 'w+');
fwrite($newhandle, $lines);
fclose($newhandle);
// DONE
}
}
closedir($dir);
?>
当我在命令提示符下运行此代码时,它不会给出任何错误消息,并且它似乎正在正常运行。但是一旦它完成并且我检查了我的文件,我发现每个文件的内容都被删除了,它们都变成0 KB文件,里面没有任何内容。
答案 0 :(得分:3)
您没有为正则表达式设置分隔符。
分隔符可以是任何(non-alphanumeric
,non-backslash
,non-whitespace
)字符。
您希望使用除/
之外的分隔符,这样您就可以避免在模式中转义/
。
您可以使用以下内容更改格式:
$pattern = '~[0-9]{4}/[0-9]{2}/[0-9]{2}~';
请参阅Live demo
答案 1 :(得分:1)
这个也做基本检查(1-12之间,1-31之间的一天)
(0(?!0)|[1-2]|3(?=[0-1]))\d\/(0(?!0)|1(?=[0-2]))\d\/\d{4}
答案 2 :(得分:0)
您应该用分隔符包围正则表达式。
例如:
$pattern = '![0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]!';
/
是常用的,但由于正则表达式本身包含/
,我使用的是!
。
答案 3 :(得分:0)
除了缺少分隔符(#和〜是收藏夹,如果/在模式中使用),您在开头寻找4位数:yyyy / mm / dd。决定你在寻找什么。您也可以执行类似
的操作[0-9]{4}/[0-9]{2}/[0-9]{2}
甚至
\d{4}/\d{2}/\d{2}
...我知道那些可以在Perl中运行,但我没有用PHP尝试过它们(它们应该工作,因为preg中的“p”代表 Perl ,但没有保证)。
答案 4 :(得分:0)
为什么要使用正则表达式?使用DateTime类进行验证。
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false
<强> function 强>
答案 5 :(得分:0)
您的代码可以像这样重写:
#!/usr/bin/php
<?php
// get the system date
$sysdate = date('d/m/Y');
// change working directory to the specified one
chdir($argv[1]);
// loop over the *.hql files in sorted order
foreach (glob('*.{hql,HQL}', GLOB_BRACE) as $file) {
echo "Converting filename: $argv[1]\\$file\n";
$contents = file_get_contents($file);
$contents = preg_replace('#\d{4}/\d{2}/\d{2}#', $sysdate, $contents);
echo $contents;
file_put_contents($file, $contents);
}
问题在于缺少PCRE正则表达式分隔符,正如其他人已经指出的那样。即使在修好之后,代码也不是很好。
自PHP 4.3.0起,glob
和file_get_contents
函数可用。从PHP 5开始,file_put_contents
函数可用。
glob
使您的代码更简洁,可读,甚至可移植,因为您不必在除信息消息之外的任何地方提及目录分隔符。您使用了\\
,但如果您希望自己的代码可以移植,则应使用DIRECTORY_SEPARATOR
。
file_get_contents
函数以字符串形式提取文件的全部内容。 file_put_contents
函数则相反 - 将字符串存储在文件中。如果你想在PHP 4中使用它,请使用此实现:
if (!function_exists('file_put_contents')):
function file_put_contents($filename, $data) {
$handle = fopen($filename, 'w');
$result = fwrite($handle, $data);
fclose($handle);
return $result;
}
endif;
另请注意,PHP中不需要最终的?>
。