Regex错误缺少终止]


Regex Error missing terminating ]

我使用gskinner regex助手站点从字符串中捕获日期,它运行良好。但是在我的php脚本中出现了抛出和错误。

我要找的是字符串中的日期。

2013年11月26日上午10:17

$string = "The following web lead was received at Nov 26 2013 10:17PM Source: 420 Source: Internet - Organic (Free) Leads Referral Fee:  none";  
$datePattern = '/(?<=received at )(?:[^])*?(?=Source)/';
preg_match($datePattern,$string,$matches);
print_r($matches);

我得到的错误是

警告:preg_match():编译失败:在第114行中C:''wamp''www''test''index.php中偏移36处的字符类缺少终止]

我不明白为什么它在gskinner工具中运行良好,但在我的脚本中失败了。这个正则表达式是社区提交的表达式之一,因为我在正则表达式方面完全不称职。

谢谢你的帮助。

这是因为[^]

在某些javascript实现中,[^]的字面意思是"所有可能的字符"(否定任何字符)。但在php中,如果右括号紧跟在左括号或否定符号^之后,则它被视为文字。因此[^])*?(?=Source)被看作是一个未闭合的字符类。

这种表示法的目标是匹配所有可能的字符(['s'S]的一种快捷方式),您可以将其替换为:

$datePattern = '/(?<=received at ).*?(?=Source)/s';

你可以在这篇令人难以置信的文章中阅读更多关于这些符号的信息。

^在字符组中有着特殊的含义,它不能单独作为[^]。在这种情况下,它意味着而不是那些字符,就像[^abc]中的除了a、b和c之外的任何字符,但您没有指定任何字符。

由于它只有一个符号,你甚至不需要把它放在一个字符组中。