替换基于正则表达式并返回操纵的字符串

时间:2014-05-16 17:24:31

标签: php regex replace preg-replace preg-replace-callback

我将逻辑查询作为字符串,例如:

  

mydate =='前一天' &安培;&安培; mydate> 2014-05-16 16:00:00

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

$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' &安培;&安培; mydate OPERATOR' 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 *

2 个答案:

答案 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