【问题标题】:PHP Regex Match From Variable来自变量的 PHP 正则表达式匹配
【发布时间】:2020-04-09 16:28:54
【问题描述】:

我正在尝试从 php 7.2 变量中匹配日期和时间。

带有日期时间的数据直接来自数据库查询。为了显示目的,在数据​​上进行了一些搜索和替换,但我尝试在搜索和替换之前和之后匹配数据。

$textdescription = $row['TEXT_DESCRIPTION'];
$search = array('#$#', '<(>', '<)>', '[');
$replace = array("\r\n", " ", " ", "\r\n\r\n[");
$ticketnotes = str_replace($search, $replace , $textdescription);
echo nl2br(htmlentities($ticketnotes, ENT_QUOTES));

这很好地显示了描述。但现在我正试图从这些数据中提取日期和时间。

$textdescription 作为一个简短的例子是:

    03/13/2020 18:04:50 WJG
    [Question] - Still Having Issues
    [Environment] - NA
    [Answer] - I explained
    [Next Steps] - ANSWERED

    03/07/2020 15:18:58 JAG
    [Question] Startup Questions
    [Environment] series
    [Answer] Customer sees 
    [Next Steps] Completed

我寻找上述两个日期时间匹配的 php 代码是:

$re = "/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/";
preg_match_all($re, $textdescription, $matches);
print_r($matches);

$matches 什么也不返回。如果我复制上面的 $textdescription 变量,并手动将其放入代码中的变量中,则一切都按预期匹配。只有从数据库中检索它时,我才得到匹配。我也试过 $ticketnotes 而不是 $textdescription 没有成功。

我希望它是我忽略的一些简单的东西。感谢您的帮助!

【问题讨论】:

  • 您确定吗,您的日期和时间总是有两位数,即使第一位是零?可能值得检查
  • 在你运行 preg_match_all 之前,也许只是检查上面的一些代码没有损坏它,print_r 等。顺便说一句对我有用3v4l.org/bQlIh
  • 正则表达式适用于提供的示例。 3v4l.org/c0A6K 您可以将正则表达式简化为 ~\d\d/\d\d/\d{4} \d\d:\d\d:\d\d~ 除非您需要匹配每个值。 \d\d\d{2}
  • 有一个空格,一个还是多个?它是 Unicode 空间吗?试试$re = "/(\d{2})\/(\d{2})\/(\d{4})\s+(\d{2}):(\d{2}):(\d{2})/u";
  • 日期是否始终位于该文本的开头且格式相同?如果是这样,一个固定长度的简单子字符串可以为您获取它。

标签: php regex variables match


【解决方案1】:

感谢大家的线索和想法。

原来 $textdescription 在浏览器窗口中显示没有问题,但是查看输出源(使用 Ctrl+U),我看到日期 MM\DD\YYYY 和时间比在浏览器窗口。我计算了空格,并更改了正则表达式。

工作代码如下:

$re = "/(\d{2})\/(\d{2})\/(\d{4})          (\d{2}):(\d{2}):(\d{2})/";

它有 10 个空格。所以总而言之,当匹配正则表达式时,即使是空格也会有所不同,并且浏览器窗口中的输出并不总是与代码中的内容匹配。

【讨论】:

  • 空白的数量可能会有所不同。可能想使用\h+,它是一个或多个水平空格。
猜你喜欢
  • 2015-12-11
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2013-02-13
  • 2020-08-06
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多