我使用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之外的任何字符,但您没有指定任何字符。
由于它只有一个符号,你甚至不需要把它放在一个字符组中。