簡體   English   中英

使用正則表達式(pcre)PHP忽略字符

[英]Ignore character using regex (pcre) PHP

我試圖從文件file-2018-02-19-second.json捕獲日期。

我正在使用.*file-(..........).*.json正則表達式捕獲文件中的日期。正則表達式正在捕獲文件中的2018-02-19日期,但我想忽略文件中的"-" ,僅捕獲20180219 我該怎么做?

如果文件名始終具有相同的格式,則可以使用DateTime::createFromFormat將字符串轉換為DateTime實例:

$date = DateTime::createFromFormat('*-Y-m-d-*.*', 'file-2018-02-19-second.json');
echo $date->format('Ymd');

您可以在php手冊中找到不同的格式字符及其含義。

$fileName = 'file-2018-02-19-second.json';
preg_match('#([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))#is', $fileName, 
$output);
if (!empty($output)) {
    $date = preg_replace('#-#is', '', $output[1]);
    echo $date;
}

希望可以幫到您!

相關鏈接: https : //www.regextester.com/96683

選項1-匹配並替換

在這里查看正在使用的代碼

<?php

$fn = 'file-2018-02-1-second.json';
$fn = preg_match('/.*file-\K\d{4}-\d{2}-\d{2}/', $fn, $o);
echo isset($o[0]) ? preg_replace('/\D+/', '', $o[0]) : 'No match found';

選項2-分組和連接

在這里查看正在使用的代碼

<?php

$fn = 'file-2018-02-1-second.json';
$fn = preg_match('/.*file-(\d{4})-(\d{2})-(\d{2})/', $fn, $o);
echo isset($o[1], $o[2], $o[3]) ? $o[1].$o[2].$o[3] : 'No match found';

模式說明

.*file-\K\d{4}-\d{2}-\d{2}
  • .*任意次數匹配任何字符
  • file-逐字匹配
  • \\K重置比賽的起點。 最終比賽中將不再包含任何以前消耗的字符。
  • \\d{4}任意數字精確匹配4次
  • -從字面上匹配
  • \\d{2}任意數字精確匹配2次
  • -從字面上匹配
  • \\d{2}任意數字精確匹配2次

第二個模式\\D+僅匹配一次或多次匹配任何非數字字符以進行替換。

最后一個模式(來自選項2)實際上只是我描述的第一個模式的簡化版本,但是將每個數字部分分組為捕獲組。

結果: 20180219

這個問題似乎僅與數據提取有關,與數據驗證無關。

代碼:( 演示

$file = 'file-2018-02-19-second.json';
$date = preg_replace('~\D+~', '', $file);
echo $date;

輸出:

20180219

如果您需要的精度/校驗比(使用file-的位置)多一些,您可以使用\\G提取日期分量,然后將其內爆。

代碼:( 演示 )( 模式演示

$file = 'somefile-2018-02-19-second.json';
echo preg_match_all('~\Gfile-\K\d+|-\K\d+~', $file, $out) ? implode($out[0]) : 'fail';
// same result as earlier method

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM