我需要一个PHP脚本来遍历目录中的所有.html文件,并在每个文件中查找长日期的第一个实例(即August 25th, 2014
),然后以短格式添加带有该日期的标记(即<p class="date">08/25/14</p>
)。
以前有人做过这样的事吗?我猜你爆炸了字符串并使用复杂的case语句将月份名称和天数转换为常规数字,然后使用/
进行内爆。
但是我在找出用于查找第一个长日期的正则表达式时遇到了麻烦。
非常感谢任何帮助或建议!
答案 0 :(得分:1)
以下是我在半伪代码中的表现......
glob()
是一个明显的选择)将HTML文件加载到DOMDocument
,例如
$doc = new DOMDocument();
$doc->loadHTMLFile($filePath);
将正文文本作为字符串
$body = $doc->getElementsByTagName('body');
$bodyText = $body->item(0)->textContent; // assuming there's at least one body tag
通过此正则表达式找到您的日期字符串
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);
将其加载到DateTime
对象中并生成短日期字符串
$dt = DateTime::createFromFormat('F jS, Y', $matches[0]);
$shortDate = $dt->format('m/d/y');
使用<p>
文字内容创建DOMElement
$shortDate
,将其插入您想要的DOMDocument
并使用{{1}写回文件}}
答案 1 :(得分:0)
我将上面有用的反应纳入我已经拥有的内容中,似乎有效。我确信它远非理想,但它仍然符合我的目的。也许它可能对其他人有所帮助:
<?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>";
}
}
?>
代码假定要修改的文件位于名为&#34; archive&#34;的目录中。与脚本位于同一目录中。
需要两个不同的preg_match
行,因为我发现一些日期列出了序数后缀(即2005年8月24日),而有些则没有(即2005年8月24日)。无法完全弄清楚如何获得处理这两者的单个preg_match
。
编辑:根据建议使用preg_match
将单\d{1,2}(st|nd|rd|th)?
替换为双{{1}}。