【问题标题】:correct regex date pattern for dd/mm/yyyydd/mm/yyyy 的正确正则表达式日期模式
【发布时间】:2013-12-10 15:46:34
【问题描述】:

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

【问题讨论】:

    标签: php regex date


    【解决方案1】:

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

    分隔符可以是任何(non-alphanumericnon-backslashnon-whitespace)字符。

    您想在/ 之外使用分隔符,这样您就不必在您的模式中转义/

    您可以使用以下方式更改格式:

    $pattern = '~[0-9]{4}/[0-9]{2}/[0-9]{2}~';
    

    Live demo

    【讨论】:

      【解决方案2】:

      这个也做基本检查(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

      【讨论】:

        【解决方案3】:

        您应该用分隔符将正则表达式括起来。

        例如:

        $pattern = '![0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]!';
        

        /是常用的,但是因为正则表达式本身包含/,所以我用!代替。

        【讨论】:

          【解决方案4】:

          除了缺少分隔符(# 和 ~ 是最喜欢的,如果在模式中使用 /),您正在寻找开头的 4 位数字:yyyy/mm/dd。决定你在寻找什么。你也可以做类似的事情

          [0-9]{4}/[0-9]{2}/[0-9]{2}
          

          甚至

          \d{4}/\d{2}/\d{2}
          

          ...我知道这些可以在 Perl 中工作,但我没有用 PHP 尝试过它们(它们应该可以工作,因为 preg 中的“p”代表 Perl,但不能保证)。

          【讨论】:

          • 非常感谢您通知我我一直在错误地使用模式!
          【解决方案5】:

          为什么要使用正则表达式?使用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

          【讨论】:

            【解决方案6】:

            您的代码可以简写如下:

            #!/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 正则表达式分隔符。即使修复了这个问题,代码也不是很好。

            globfile_get_contents 函数自 PHP 4.3.0 起可用。 file_put_contents 函数自 PHP 5 起可用。

            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;
            

            还要注意,最后的?&gt; 在 PHP 中不是必需的。

            【讨论】:

            • 谢谢,我会把它分享给我的同事,以便他们讨论更换。
            • @user3087150 希望你能了解你的代码有多短。这样就更容易阅读和调试了。
            猜你喜欢
            • 1970-01-01
            • 2023-04-07
            • 2022-01-04
            • 2017-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多