PHP按日期爆炸,同时保持定界符

时间:2018-06-26 10:55:34

标签: php arrays explode

我的字符串看起来像这样05/21/2018 ghijkl 06/12/2018 mnopqrst

我需要提取每个日期之后的所有值并包括日期。我尝试过

explode('/2018', $string);

但是那会分开日期,也不是面向未来的。我在想必须有一种在元素中包含定界符的方法。也许我应该使用正则表达式来查找日期?

谢谢。

5 个答案:

答案 0 :(得分:0)

您可以使用current(explode('/', $string));

答案 1 :(得分:0)

假设您的日期被保证按照您提到的格式进行格式化(如果是用户输入数据,则通常认为这样做不安全),则可以使用正则表达式在日期之后查找字符串:

使用带有以下表达式的PHP正则表达式拆分: uploadFile

/([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4})([a-zA-Z\s]+)/g分成具有不同组的数组。根据实际需要输出数据的方式,可以在一个匹配组中捕获日期和后续字符串。

示例代码:

05/21/2018 ghijkl 10/12/2017 mnopqrst

https://regex101.com/r/gPXkDz/2

答案 2 :(得分:0)

您可以这样做

$str = '05/21/2018 ghijkl 10/12/2017 mnopqrst';
$arr = explode(' ',$str);
$new = array();
for($i=0;$i<count($arr);$i+=2){
  $new[] = ["date"=>$arr[$i],"value"=>$arr[$i+1]];
}
print_r($new);

Live Demo

输出:

Array
(
    [0] => Array
        (
            [date] => 05/21/2018
            [value] => ghijkl
        )

    [1] => Array
        (
            [date] => 10/12/2017
            [value] => mnopqrst
        )

)

答案 3 :(得分:0)

您可以使用正则表达式来实现。这是示例代码:

<?php

$string = '05/21/2018 ghijkl 06/12/2018 mnopqrst';
$matches = [];

if (preg_match_all('#(\d{2}\/\d{2}\/\d{4})#i', $string, $matches) > 0) {
  echo "Found the following dates: \n";

  foreach ($matches[0] as $date) {
    printf("- %s\n", $date);
  }
}

这将导致以下输出:

Found the following dates:
- 05/21/2018
- 06/12/2018

答案 4 :(得分:0)

您可以将preg_splitPREG_SPLIT_DELIM_CAPTUREPREG_SPLIT_NO_EMPTY标志一起使用,以保留定界符并从结果数组中删除空值。

您可以使用与日期格式\b\d{1,2}/\d{1,2}/\d{4}\b匹配的模式请注意,它与示例数据中的日期格式匹配并且不验证日期本身)

例如:

$str = '05/21/2018 ghijkl 06/12/2018 mnopqrst';
$result = preg_split('@(\b\d{1,2}/\d{1,2}/\d{4}\b)@', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
var_dump($result);

Demo

要验证日期,您可以使用DateTime,也可以使用createFromFormat指定格式。

$date = DateTime::createFromFormat("m/d/Y", '05/21/2018');