正则表达式错误缺少终止]

时间:2013-12-01 06:00:45

标签: php regex

我使用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工具中工作正常但在我的脚本中失败了。 这个正则表达式是社区提交的表达式之一,因为我在正则表达式方面完全不称职。

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

这是因为[^]

对于一些javascript实现[^]意味着文字“所有可能的字符”(否定无效)。但是在php中,如果它在开始括号或否定符号^之后立即显示,则结束方括号被视为字面值。因此[^])*?(?=Source)被视为未封闭的角色类。

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

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

您可以在this incredible post.

中阅读有关这类符号的更多信息

答案 1 :(得分:0)

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

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