根据regex进行替换并返回经过处理的字符串


Replace based on regex and return manipulated string

我有一个字符串形式的逻辑查询,例如:

mydate == 'one day ago' &&Mydate> 2014-05-16 16:00:00

我需要用时间戳替换每个日期实例。我当前的代码可以使用strtotime()YYYY-MM-DD HH:MM:SS日期时间替换为时间戳:

$my_string = "mydate == 'one day ago' && mydate > 2014-05-16 16:00:00";
// Pattern: *YYYY-MM-DD HH:MM:SS*
$pattern = '((?:2|1)''d{3}(?:-|''/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|''/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|''s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))';
$my_string = preg_replace_callback($pattern, function($m){return strtotime($m[0]);}, $my_string);
echo($my_string);
输出:

mydate == 'one day ago' &&Mydate> 1400252400

然而,我也想支持自然语言相关短语。查询字符串总是一个集合结构:

mydate OPERATOR ' DATE ' &&mydate OPERATOR ' DATE '…

我想做的是找到变量mydate跳过操作符,然后获得单引号内的内容,将strtotime()应用于单引号的内容,然后用整数替换日期(包括单引号)。例如:

输入:

mydate == 'one day ago' &&Mydate> '2014-05-16 16:00:00'

目标过程:

mydate == timetostr('one day ago') &&mydate> timetostr('2014-05-16 16:00:00')

输出:

mydate == 123123123123 &&Mydate> 1400252400

请注意当前输入和新输入之间的差异,现在我希望两个实例都有单引号,并且不使用仅为日期-时间字符串设计的正则表达式。

如何创建一个正则表达式variable_name *‘*’

其中*为任意字符,取''的内容并返回variable_name*

尝试使用:[^'-+'*=]+'s*['-+'*=]{1,2}'s*('[^']+')'s*'&'&(regex101)

第一个字符类是任何非操作符字符1次或多次,然后是0个或多个空白字符,然后是1个或2个操作符字符(您可能希望也可能不希望在这里包括尖括号),然后是0个或多个空白字符,然后捕获'*',正如您上面所说的。

我根据@adamdc78的链接信息解决了这个问题

$str = "mydate == '1 day ago' && mydate != '2014-05-16 16:00:00' && myname = 'Craig' || mydate > '2014-05-16 16:00:00'"; 
$var_name = 'mydate';
$re = '/'.$var_name.''s*['-+'='<'>'!]{1,2}'s*(''[^'']+'')/'; 
$my_string =    preg_replace_callback(
                    $re,
                    function($m)
                    {
                        foreach($m as $key=>$value)
                        {
                            $m[0] = str_replace('''','',$m[0]);
                            $m[1] = str_replace('''','',$m[1]);
                            $m[0] =     str_replace($m[1],strtotime($m[1]),$m[0]);
                        }
                        return($m[0]);
                    },
                $str
                );
echo($my_string);

输出

mydate == 1400245345 &&= 1400252400 &&myname = 'Craig' || mydate> 1400252400