我使用gskinner regex helper site从字符串中捕获日期并且工作正常。但我的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工具中工作正常但在我的脚本中失败了。 这个正则表达式是社区提交的表达式之一,因为我在正则表达式方面完全不称职。
感谢您的帮助。
答案 0 :(得分:6)
这是因为[^]
。
对于一些javascript实现[^]
意味着文字“所有可能的字符”(否定无效)。但是在php中,如果它在开始括号或否定符号^
之后立即显示,则结束方括号被视为字面值。因此[^])*?(?=Source)
被视为未封闭的角色类。
此表示法的目标是匹配所有可能的字符([\s\S]
的一种快捷方式),您可以将其替换为:
$datePattern = '/(?<=received at ).*?(?=Source)/s';
中阅读有关这类符号的更多信息
答案 1 :(得分:0)
^
在字符组中具有特殊含义,它不能单独作为[^]
。在这种情况下,它意味着不是那些字符,因为[^abc]
意味着除了a,b和c 之外的任何东西,但你没有指定任何字符。
由于它只有一个符号,你甚至不需要把它放在一个字符组中。