我面对的字符串如下:
C
,M
,P
,T
,K
,X
或Q
; M
字面; /
; M
字面; 我几乎可以肯定我已将其正确地转换为以下正则表达式,但这行PHP代码在传递有效字符串时仍返回NULL。此外,当我使用regexpal和相同的主题字符串测试此正则表达式时,将返回正确的结果。我很确定我遇到了模式分隔符或前两组的问题(行开始然后是字符检查)。有任何想法吗? - 布兰登
preg_match_all('&^(\C|\M|\P|\T|\K|\X|\Q)[A-Z0-9]{3}.*\sM?[0-9]{2}/M?[0-9]{2,3}\s&', $subject, $resultArr);
答案 0 :(得分:2)
首先,我建议使用更常见的模式分隔符,例如/
,#
或~
。我个人实际上不会在这里使用/
,因为你在模式中使用它。这只是偏好,&
完全有效。
其次,不需要反斜杠和行开头的字符(你也可以使用这些字符类,我发现它们更具可读性)。如图所示,其中一些确实构成了有效的转义序列,因此您可能会遇到不可预测的行为。
第三,我猜你想要一个不合格的搜索(模式后的U
模式修饰符)。我发现在大多数情况下,当在模式中的某处使用.*
时,这是期望的行为。在这种情况下,由于您正在使用preg_match_all()
贪婪搜索特别成问题,因为它将匹配模式的第一部分与最后一个案例匹配的第一个案例,模式的最后部分与所有模式匹配其他潜在的匹配集中在模式的.*
部分。
所以这给我们带来了类似的东西:
$pattern = '#^[CMPTKXQ][A-Z0-9]{3}.*\sM?[0-9]{2}/M?[0-9]{2,3}\s#U';
preg_match_all($pattern, $subject, $resultArr);