Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加第二个捕获组时PHP正则表达式搜索失败_Php_Regex - Fatal编程技术网

添加第二个捕获组时PHP正则表达式搜索失败

添加第二个捕获组时PHP正则表达式搜索失败,php,regex,Php,Regex,我有以下命名的捕获组,它完全按照预期工作。它从文本字符串中获取特定格式的最后日期/时间 $re = "/.*(?<date>[0-9]+\\/[0-9]+\\/[0-9]+ [0-9]+:[0-9]+:[0-9]{1,2} (AM|PM))/s"; $re=“/.*([0-9]+\\/[0-9]+\\/[0-9]+[0-9]+:[0-9]+:[0-9]{1,2}(AM | PM))/s”; 我想捕获下面的用户ID,因此我将其更改为 $re = "/.*(?<date>

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

$re = "/.*(?<date>[0-9]+\\/[0-9]+\\/[0-9]+ [0-9]+:[0-9]+:[0-9]{1,2} (AM|PM))/s";
$re=“/.*([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"; 
$re=“/.*([0-9]+\\/[0-9]+\\/[0-9]+[0-9]+:[0-9]+:[0-9]{1,2}(AM | PM))(?\\w+)/s”;
但是,当我这样做时,它会破坏两个值,产生以下错误

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

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

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

使用PHP5.5.9

所以问题是,我是否在这个regex语句中遗漏了一些东西,导致外部站点和内部代码之间的冲突,或者这是否有效,意味着完全是我的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;
$LastDateRegex=“/.*([0-9]+\\/[0-9]+\\/[0-9]+[0-9]+:[0-9]+:[0-9]{1,2}(AM | PM))/s”;
preg_match($LastDateRegex,$arr2['WorkLog'],$LastDateMatches);
$Modsecs=(strotime($ts)-strotime($LastDateMatches['date'])%60;

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

这里有一个额外的
\
\\w+
\
在一些地方,如果这有区别的话

不太确定要返回什么,但运行此正则表达式,
$str
是您在regex101链接中的文本

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

你能提供你的代码的更广泛的快照吗?我想错误不在regexp中,而是在周围的代码中(例如,使用数组$array['date'],其中'date'键未初始化)。您得到的注意是,$LastDateMatches['date']中的'date'键未初始化。代码与第一个regex值一样工作正常。密钥在预匹配过程中初始化,并在代码中稍后很好地拉出。。。我遇到的唯一问题是给出的第二个正则表达式示例使其无法工作。如果第一个代码运行良好,则应继续使用第二个代码,除非我以某种方式弄乱了正则表达式,或者对命名捕获组有一些限制。请发布从最后一个日期/时间开始并在下一个单词后结束的子字符串。提供的regex 101链接有我要传递到的字符串的扩展示例代码。这删除了我字符串中的AM/PM,因为它是非捕获组(出于某种原因,我仍然会遇到相同的问题,如果我包含“(?\w+”部分,它会使我的preg_匹配不起作用。我感觉在我编辑正则表达式时,我的服务器出现了一些问题,而不是正则表达式。没有移动)。是的,AM/PM捕获在一个非捕获组中,因为您不需要结果本身,您只需要它与基于代码的时间戳一起。我的建议是重新启动Apache服务器,看看这是否解决了问题,上面的代码可以在我的服务器上运行
Array
(
    [0] => ...
    [date] => 6/20/2014 10:04:32 PM
    [1] => 6/20/2014 10:04:32 PM
    [name] => ihugett
    [2] => ihugett
)