【问题标题】:PHP Regex search failing when adding a second capture group添加第二个捕获组时 PHP 正则表达式搜索失败
【发布时间】:2014-08-15 15:15:43
【问题描述】:

我有以下命名的捕获组,它完全按照预期工作。它从文本字符串中获取特定格式的最后日期/时间。

$re = "/.*(?<date>[0-9]+\\/[0-9]+\\/[0-9]+ [0-9]+:[0-9]+:[0-9]{1,2} (AM|PM))/s";

我想捕获后面的用户 ID 所以我把它改成了下面的

$re = "/.*(?<date>[0-9]+\\/[0-9]+\\/[0-9]+ [0-9]+:[0-9]+:[0-9]{1,2} (AM|PM)) (?<name>\\w+)/s"; 

但是,当我这样做时,它会破坏两个值并给出以下错误

注意:未定义索引:第 272 行 Q:\XAMPP\htdocs\index.php 中的日期

错误源于 preg_match 匹配数组为空。一旦正则表达式更改为第二个值,print_r 确认数组不包含任何信息。

正如下面的 Regex101 链接所示,这两种方法在外部站点中都可以正常工作

http://regex101.com/r/zO0mK0/4

使用 PHP 5.5.9

所以问题是,我是否在这个正则表达式语句中遗漏了一些东西,它破坏了外部站点和我的内部代码之间的关系,或者这个工作是否意味着它 100% 纯粹是我的 php 导致了这个问题。

    $LastDateRegex = "/.*(?<date>[0-9]+\\/[0-9]+\\/[0-9]+ [0-9]+:[0-9]+:[0-9]{1,2} (AM|PM))/s";  
    preg_match($LastDateRegex, $arr2['WorkLog'], $LastDateMatches);
    $Modsecs = (strtotime($ts) - strtotime($LastDateMatches['date']))%60;

这是正在使用的代码示例。如上所述,我知道错误源于第二个正则表达式示例的 $LastDateMatches 数组为空,但是代码与第一个示例 100% 一起工作,因此两者之间存在导致问题的原因。

【问题讨论】:

  • 您能否提供更广泛的代码快照?我想错误不在正则表达式中,而是在周围的代码中(例如,使用未初始化“日期”键的数组 $array['date'])。
  • 您得到的通知是 $LastDateMatches['date'] 中的 'date' 键未初始化。
  • 代码工作正常,就像第一个正则表达式值一样。密钥在预赛期间被初始化,并在代码中稍后被拉出......我遇到的唯一问题是给出的第二个正则表达式示例阻止了它的工作。如果代码与第一个一起工作正常,它应该继续与第二个一起工作,除非我以某种方式弄乱了正则表达式或命名捕获组有一些限制
  • 你能贴出从最后一个日期/时间开始到下一个单词结束的子字符串吗?
  • 提供的 Regex 101 链接有一个我传递给代码的字符串的扩展示例。

标签: php regex


【解决方案1】:

你有一个额外的\:\\w+ 和\\ 在几个地方,如果这有什么不同?

不太确定你想要返回什么,但运行这个正则表达式,$str 是你在 regex101-link 中的文本,

$regex = "/.*(?<date>\d+\/\d+\/\d+ \d+:\d+:\d{1,2} (?:AM|PM)) (?<name>\w+)/s";
preg_match($regex, $str, $LastDateMatches);

输出,

Array
(
    [0] => ...
    [date] => 6/20/2014 10:04:32 PM
    [1] => 6/20/2014 10:04:32 PM
    [name] => ihugett
    [2] => ihugett
)

【讨论】:

  • 由于使其成为非捕获组,这将 AM/PM 从我的字符串中删除(出于某种原因,如果我包含 "(?\w+) " 部分它使我的 preg_match 无法正常工作。我感觉我的服务器而不是正则表达式存在一些问题。
  • 在我编辑正则表达式时错过了移动 ),就这样。是的,AM/PM 捕获位于非捕获组中,因为无论哪种方式,您都不需要该结果,您只希望它与基于您的代码的时间戳一起使用。我的建议是重新启动您的 Apache 服务器,看看是否能解决问题,上面的代码在我的服务器上运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多