正则表达式匹配PHP中的所有英国注册牌照

时间:2011-08-13 07:46:21

标签: php regex

我正在尝试搜索所有有效英国注册牌的字符串。我发现以下正则表达式与2001年前/后英国车牌号匹配:

^([A-Z]{3}\s?(\d{3}|\d{2}|d{1})\s?[A-Z])|([A-Z]\s?(\d{3}|\d{2}|\d{1})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})$

我如何使用preg_match_all来返回字符串中找到的所有有效号码牌?

例如:

This is some random text NV07 ABC This is A0123 ABC some more random text AB08ABC

应该返回:

  • NV07 ABC

  • AB08ABC

4 个答案:

答案 0 :(得分:2)

^$(字符串的开头和结尾)锚点替换为\b(单词的开头/结尾)锚点。

preg_match_all('/\b([A-Z]{3}\s?(\d{3}|\d{2}|d{1})\s?[A-Z])|([A-Z]\s?(\d{3}|\d{2}|\d{1})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})\b/', $subject, $result, PREG_PATTERN_ORDER);

答案 1 :(得分:0)

从php的手册:

  

int preg_match_all(string $ pattern,string $ subject [,array& $ matches [,int $ flags = PREG_PATTERN_ORDER [,int $ offset = 0]]])

     

将所有匹配的主题搜索到模式中给出的正则表达式,并按照flags指定的顺序将它们放在匹配中。

     

在找到第一个匹配项后,后续搜索将从>最后一场比赛结束时继续。

所以你需要这样做:

a = array();
preg_match_all ( your_regexp , your_random_string,a)

答案 2 :(得分:0)

请注意,正则表达式有一个错误,导致它匹配ABCdD而不是ABC1D作为号牌。

它缺少第一个'(\ d {3} | \ d {2} | d {1})'中的'\',它应该是'(\ d {3} | \ d {2} | \ d {1})。

这不是一个大问题,因为它只影响1983年或更早的登记,只有一位数。

我可能会将其更新为:

^([A-Z]{3}\s?(\d{1,3})\s?[A-Z])|([A-Z]\s?(\d{1,3})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?(0[2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})$

与上面相同,这仍然匹配一些可能无效的前缀/后缀字母,例如IOUZ。 Q作为后缀可能也无效。对于其他人来说,这个帖子和其他来源的正则表达式,它也不匹配无日历板块(1903-1963发行)或北爱尔兰板块(也是英国的一部分),这两者都可能是一个问题,如果你关注个性化的盘子。所以请记住这些限制。

答案 3 :(得分:0)

有一个优秀的gist,它有一个基于official guidelines的正则表达式:

(?<Current>^[A-Z]{2}[0-9]{2}[A-Z]{3}$)|(?<Prefix>^[A-Z][0-9]{1,3}[A-Z]{3}$)|(?<Suffix>^[A-Z]{3}[0-9]{1,3}[A-Z]$)|(?<DatelessLongNumberPrefix>^[0-9]{1,4}[A-Z]{1,2}$)|(?<DatelessShortNumberPrefix>^[0-9]{1,3}[A-Z]{1,3}$)|(?<DatelessLongNumberSuffix>^[A-Z]{1,2}[0-9]{1,4}$)|(?<DatelessShortNumberSufix>^[A-Z]{1,3}[0-9]{1,3}$)