我正在尝试搜索所有有效英国注册牌的字符串。我发现以下正则表达式与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
答案 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}$)