【问题标题】:Replace based on regex and return manipulated string基于正则表达式替换并返回操作字符串
【发布时间】:2014-07-05 06:07:06
【问题描述】:

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

mydate == '一天前' && 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 == '一天前' && 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*

【问题讨论】:

  • 这一切的最终目标是什么?
  • @CasimiretHippolyte 运行逻辑/查询导致真假

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


【解决方案1】:

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

第一个字符类是任何非运算符字符 1 次或多次,然后是 0 或更多空白字符,然后是 1 或 2 个运算符字符(您可能希望或可能不希望在此处包含尖括号),然后是 0 或更多空白字符然后你捕获上面所说的'*'

【讨论】:

  • 亚当,非常感谢您的回复和非常有用的链接!实际上,我从该资源和您的示例中学到了很多关于正则表达式的知识,我认为我现在已经有足够的东西可以使用了。我什至现在明白这意味着什么,是时候让我流利使用正则表达式了。非常感谢。
  • 不客气。另一个非常好的正则表达式资源:RexEgg,
【解决方案2】:

根据@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 && mydate != 1400252400 && myname = 'Craig' ||我的日期 > 1400252400

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2020-12-22
    • 2018-07-13
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多