我有一个字符串形式的逻辑查询,例如:
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
' &&mydateOPERATOR
'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