正确的正则表达式日期模式为dd / mm / yyyy

时间:2013-12-10 15:46:35

标签: php regex date

我需要在一组文件中更新同一行,其中还包括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文件,里面没有任何内容。

6 个答案:

答案 0 :(得分:3)

您没有为正则表达式设置分隔符。

分隔符可以是任何(non-alphanumericnon-backslashnon-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}

现场直播:http://regex101.com/r/jG9nD5

答案 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起,globfile_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中不需要最终的?>