从另一个字符串中获取日期和字符串

时间:2014-09-09 11:22:32

标签: php regex

我有一堆像这样的字符串,例如:

时间:22:30(25)|日期:2011年3月19日|贡献者:推销员

现在,我想在Contributor之后提取日期和字符串,即Salesman。

目前,我在PHP中使用explode()函数。

但问题是,字符串有很多变化,如:

  • 时间:22:30(25)|日期:2011年3月19日
  • 时间:22:30(25)|日期:2011年|贡献者:推销员
  • 时间:22:30(25)|贡献者:推销员
  • 时间:22:30(25)|日期:2011年

我想要一些适合所有变化的东西。如果某个字段不可用,我会将其视为NULL。对于完整日期,我需要将日期存储在数据库中,并且只有一年我将保存年份。

建议我解决这个问题的一些代码,或者PHP中的正则表达式,如果可以通过它解决这个问题。

3 个答案:

答案 0 :(得分:0)

我想你想要这样的东西,

^.*?\|\s*\K(?:Date:\s*((?:\d{2}\s*\S+)?\s*\d{4})\s*\|?)?\s*(?:Contributor:\s*(\S+))?

DEMO

组索引1包含Date:字段的值,组索引2包含Contributor:字段的值。

代码:

<?php
$data = <<< EOT

    Time: 22:30 (25) | Date: 19 March 2011
    Time: 22:30 (25) | Date: 2011 | Contributor: Salesman
    Time: 22:30 (25) | Contributor: Salesman
    Time: 22:30 (25) | Date: 2011
EOT;
$regex =  '~^(?:.*?\|\s*)(Date:\s*((?:\d{2} \S+ )?\d{4}))?(?:\s\|\s*)?(Contributor:\s*(\S+))?\s*$~m';
preg_match_all($regex, $data, $matches);
print_r($matches);
?>

输出:

Array
(
    [0] => Array
        (
            [0] =>     Time: 22:30 (25) | Date: 19 March 2011
            [1] =>     Time: 22:30 (25) | Date: 2011 | Contributor: Salesman
            [2] =>     Time: 22:30 (25) | Contributor: Salesman
            [3] =>     Time: 22:30 (25) | Date: 2011
        )

    [1] => Array
        (
            [0] => Date: 19 March 2011
            [1] => Date: 2011
            [2] => 
            [3] => Date: 2011
        )

    [2] => Array
        (
            [0] => 19 March 2011
            [1] => 2011
            [2] => 
            [3] => 2011
        )

    [3] => Array
        (
            [0] => 
            [1] => Contributor: Salesman
            [2] => Contributor: Salesman
            [3] => 
        )

    [4] => Array
        (
            [0] => 
            [1] => Salesman
            [2] => Salesman
            [3] => 
        )

)

答案 1 :(得分:0)

Time:.*?\|\s*(?:Date:\s*([0-9a-zA-Z ]+))?\|?\s*(?:Contributor:\s*([a-zA-Z0-9 ]+))?

试试这个。这只会提供群组。

参见演示。

http://regex101.com/r/nG1gU7/18

答案 2 :(得分:0)

您可以尝试这样的事情:

$string = 'Time: 22:30 (25) | Date: 19 March 2011';

function str_func($string, $key, $remove_key = FALSE)
{
    $string = trim($string);

    if ($string[strlen($string) - 1] !== '|') {
        $string .= '|';
    }

    $pos = strpos(strtolower($string), strtolower($key) . ':');

    if ($pos !== FALSE) {

        $return = strstr(substr($string, $pos), '|', true);

        return ($remove_key) ? trim(substr($return, strlen($key) + 1)) : $return;
    } else {
        return NULL;
    }
}

所以只需将字符串传递给&#39; Time&#39;或者&#39;贡献者&#39; (以及您是否喜欢要删除的密钥),例如

//Will return Time: 22:30 (25)
echo str_func($string, 'time');

//Will remove 'date: ' from the returned string
echo str_func($string, 'date', TRUE);

希望这有帮助!