我将逻辑查询作为字符串,例如:
mydate =='前一天' &安培;&安培; mydate> 2014-05-16 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
但是,我也想支持自然语言相对短语。查询字符串始终具有设置结构:
mydate
OPERATOR
'DATE
' &安培;&安培; mydateOPERATOR
'DATE
' ...
我想要做的是找到变量mydate
跳过运算符然后获取单引号内的内容,将strtotime()
应用于单引号的内容然后替换带整数的日期(包括单引号)。例如:
输入:
mydate =='前一天' &安培;&安培; 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 *
答案 0 :(得分:0)
尝试使用:
[^\-+\*=]+\s*[\-+\*=]{1,2}\s*('[^']+')\s*\&\&
(regex101)
第一个字符类是任何非运算符字符1次或更多次,然后是0个或更多个空格字符,然后是1或2个运算符字符(您可能想要也可能不想在此处包含尖括号)然后是0个或更多个空白字符然后你抓住'*'
就像你上面所说的一样。
答案 1 :(得分: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&amp;&amp; mydate!= 1400252400&amp;&amp; myname =&#39; Craig&#39; || mydate&gt; 1400252400