我有一个逻辑查询作为字符串,例如:
mydate ==‘1天前’& mydate > 2014-05- 16 :00:00
我需要一个日期的每一个实例替换为一个时间戳。我的当前代码可以使用YYYY-MM-DD HH:MM:SS
将strtotime()
的日期时间替换为时间戳:
$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 ==‘一天前’& mydate > 1400252400
不过,我也想支持自然语言的相关短语。查询字符串始终为set结构:
OPERATOR
'DATE
‘& mydateOPERATOR
’DATE
‘.
我想做的是找到变量mydate
跳过操作符,然后在单引号中获取内容,将strtotime()
应用于单引号的内容,然后用整数替换日期(包括单引号)。例如:
输入:
mydate ==‘一天前’& mydate > '2014-05- 16 :00:00‘
目标进程:
mydate ==
timetostr('one day ago')
&& mydate >timetostr('2014-05-16 16:00:00')
输出:
mydate == 123123123123 && mydate > 1400252400
注意我的当前输入和新输入之间的区别,现在我希望这两个实例都有单引号,而不是使用只为日期时间字符串设计的正则表达式。
如何按照变量_name*‘*的方式进行正则表达式?
其中*是任何字符,接受'‘的内容并返回variable_name*
发布于 2014-05-16 10:55:03
尝试使用:[^\-+\*=]+\s*[\-+\*=]{1,2}\s*('[^']+')\s*\&\&
(regex101)
第一个字符类是任何非运算符字符1次或更多次,然后是0或更多空格字符,然后是1或2个运算符字符(您可能希望或不想在这里包含尖括号),然后是0或更多的空白字符,然后您捕获您前面所称的'*'
。
发布于 2014-05-17 05:04:57
我已经根据@adamdc78 78链接上的信息解决了这个问题。
$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 && mydate != 1400252400 & myname = 'Craig‘\ mydate > 1400252400
https://stackoverflow.com/questions/23701180
复制相似问题