【问题标题】:PHP Convert Full Date To Short DatePHP将完整日期转换为短日期
【发布时间】:2014-12-03 02:50:12
【问题描述】:

我需要一个 PHP 脚本来遍历目录中的所有 .html 文件,并在每个文件中找到长日期的第一个实例(即August 25th, 2014),然后以短格式添加带有该日期的标签(即@ 987654322@).

以前有人做过这样的事情吗?我猜你会分解字符串并使用复杂的 case 语句将月份名称和日期转换为常规数字,然后使用 / 内爆。

但我无法确定用于查找第一个长日期的正则表达式。

任何帮助或建议将不胜感激!

【问题讨论】:

  • 如果你展示你迄今为止尝试过的东西,你可能会收到更少的反对票
  • 感谢您的建议...对于 stackoverflow 来说相对较新,并且没有意识到人们会在不要求澄清或其他细节的情况下惩罚我。无论如何,我感谢您的帮助和建议!

标签: php regex date


【解决方案1】:

这是我在半伪代码中的做法...

  1. 使用任何漂浮在您的船上的文件循环浏览所有文件(glob() 是一个显而易见的选择)
  2. 将 HTML 文件加载到 DOMDocument 中,例如

    $doc = new DOMDocument();
    $doc->loadHTMLFile($filePath);
    
  3. 获取正文作为字符串

    $body = $doc->getElementsByTagName('body');
    $bodyText = $body->item(0)->textContent; // assuming there's at least one body tag
    
  4. 通过这个正则表达式查找您的日期字符串

    preg_match('/(January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}(st|nd|rd|th)?, \d{4}/', $bodyText, $matches);
    
  5. 将此加载到DateTime 对象中并生成一个短日期字符串

    $dt = DateTime::createFromFormat('F jS, Y', $matches[0]);
    $shortDate = $dt->format('m/d/y');
    
  6. 使用$shortDate 文本内容创建<p> DOMElement,将其插入到您想要的DOMDocument 中,然后使用$doc->saveHTMLFile($filePath) 写回文件

【讨论】:

  • 这个更全面,+1
  • 非常感谢您的回复。第 4 步和第 5 步中的 preg_match 和日期格式代码正是我所需要的。
【解决方案2】:

我将上述有用的回复整合到我已经拥有的内容中,并且它似乎有效。我确信它远非理想,但它仍然符合我的目的。也许它可能对其他人有帮助:

<?php
$dir = "archive";
$a = scandir($dir);

$a = array_diff($a, array(".", ".."));

foreach ($a as $value) {

    echo '</br>File name is: ' . $value . "<br><br>";

    $contents = file_get_contents("archive/".$value);

    if  (preg_match('/(January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}(st|nd|rd|th)?, \d{4}/', $contents, $matches)) {

        echo 'the date found is: ' . $matches[0] . "<br><br>";

        $dt = DateTime::createFromFormat('F jS, Y', $matches[0]);   
        $shortDate = $dt->format('m/d/y');

        $dateTag = "\n" . '<p class="date">' . $shortDate . '</p>';

        $filename ="archive/".$value;
        $file = fopen($filename, "a+");

        fwrite($file, $dateTag);
        fclose($file);

        echo 'Date tag added<br><br>';

    } else {

        echo  "ERROR: No date found<br><br>";

    }
}
?>

代码假定要修改的文件位于名为“archive”的目录中,该目录与脚本位于同一目录中。

需要两条不同的preg_match 行,因为我发现有些日期带有序号后缀(即 2005 年 8 月 24 日),而有些则没有(即 2005 年 8 月 24 日)。无法完全弄清楚如何获得一个同时处理两者的preg_match

编辑: 按照建议使用 \d{1,2}(st|nd|rd|th)? 将双 preg_match 替换为单 @。

【讨论】:

  • 只要使用\d{1,2}(st|nd|rd|th)?
  • 啊……就是这样。在st| 之前,我用?:?! 尝试了所有这些事情。我又欠你了,更正了我的解决方案。很高兴有像你这样的人。
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 2020-11-03
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2020-06-04
相关资源
最近更新 更多