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

Php 从另一个字符串中获取日期和字符串,php,regex,Php,Regex,我有一堆这样的字符串,例如: 时间:22:30(25)|日期:2011年3月19日|投稿人:销售员 现在,我想在Contributor,即saller之后提取日期和字符串 目前,我正在PHP中使用explode()函数 但问题是,字符串有许多变体,如: 时间:22:30(25)|日期:2011年3月19日 时间:22:30(25)|日期:2011 |投稿人:业务员 时间:22:30(25)|投稿人:业务员 时间:22:30(25)|日期:2011 我想要一种适合所有变化的完美产品。当一个字段

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

时间:22:30(25)|日期:2011年3月19日|投稿人:销售员

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

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

但问题是,字符串有许多变体,如:

  • 时间:22:30(25)|日期:2011年3月19日
  • 时间:22:30(25)|日期:2011 |投稿人:业务员
  • 时间:22:30(25)|投稿人:业务员
  • 时间:22:30(25)|日期:2011
我想要一种适合所有变化的完美产品。当一个字段不可用时,我将将其视为<代码> null <代码>。对于完整日期,我需要将日期存储在数据库中,仅对于年份,我将保存年份


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

我想你想要这样的东西

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

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

代码:

尝试此操作。这将只提供可用的组

见演示


您可以尝试以下方法:

$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;
    }
}
因此,只需将字符串和“Time”或“Contributor”(以及您是否希望删除密钥)传递给它即可


希望这有帮助

是否要将密钥(例如时间或参与者)与字符串一起返回?否,不需要。我可以使用数组索引来获取字符串,但它应该在任何情况下都能工作。或者
Date:\s*((?:\d{2}\s+)\d{4})Contributor:\s*(\s+)
在preg_match()中,这会引发一个错误:警告:preg_match():没有结束分隔符“^”您使用了分隔符吗?从正则表达式中删除
^
,然后重试。您发布的代码不适用于此情况:时间:22:30(25)|日期:2011年3月19日|投稿人:推销员。返回空数组。这在演示中看起来不错,但当我在PHP中将它与preg_match()一起使用时,返回一个错误:警告:preg_match():分隔符不能是字母数字或反斜杠。我不知道如何编写正则表达式。@forthaction如何应用正则表达式。@forthaction'//g'$pattern='时间:.*?\\\s*(?:日期:\s*([0-9a-zA-Z]+)?\\\\s*(?:参与者:\s*([a-zA-Z0-9]+));预匹配($pattern,$str,$matches,预偏移捕获,3);打印(匹配项)@forthaction使用“//g”将模式括在/
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] => 
        )

)
Time:.*?\|\s*(?:Date:\s*([0-9a-zA-Z ]+))?\|?\s*(?:Contributor:\s*([a-zA-Z0-9 ]+))?
$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;
    }
}
//Will return Time: 22:30 (25)
echo str_func($string, 'time');

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