3v4l.org

run code in 150+ php & hhvm versions
Bugs & Features
<?php $arr_postcode_regexes = array( 'uk' => array( // Should match any *valid* UK postcode array('[A-Z]', '[A-Z]?', '[0-9]', '[0-9A-Z]?'), ), 'offshore' => array( // All postcode areas that DPD define as "offshore" array('A', 'B', '3', '[0-8]'), // AB30-38 array('A', 'B', '4', '[1-9]'), // AB41-49 array('A', 'B', '5', '[0-6]'), // AB50-56 array('F', 'K', '1', '[789]'), // FK17-19 array('F', 'K', '2', '[01]'), // FK20-21 array('G', '8', '3'), // G83 array('G', 'Y', '9'), // GY9 array('H', 'S', '[1-9]'), // HS1-9 array('I', 'M', '[0-9]', '[0-9A-Z]?'), // IM array('I', 'M', '[0-9]', '[0-9A-Z]?'), // IV array('K', 'A', '2', '[89]'), // KA27-28 array('K', 'W', '[0-9]', '[0-9]?'), // KW0-99 array('P', 'A', '[2-9]', '[0-9]'), // PA20-99 array('P', 'H', '1', '[5-9]'), // PH15-19 array('P', 'H', '[2-9]', '[0-9]'), // PH20-99 array('T', 'R', '2', '[1-5]'), // TR21-25 array('Z', 'E', '[0-9]', '[0-9A-Z]?'), // ZE ), 'ni' => array( // Northern Ireland array('B', 'T', '[0-9]', '[0-9A-Z]?'), // ZE ), ); // Turn the readable-ish map above into actual regexes // It's important that all regexes match only full, valid postcodes, as prefix matching can be ambiguous. // Pack everything out with \s* because people are idiots and put whitespace in weird places. foreach ($arr_postcode_regexes as $str_id => $arr_parts) { $arr_temp = array(); foreach ($arr_parts as $arr_part) { $arr_temp[] = implode('\s*', $arr_part) . '\s*[0-9]\s*[A-Z]\s*[A-Z]'; } $arr_postcode_regexes[$str_id] = '^\s*(' . implode('|', $arr_temp) . ')\s*$'; } var_dump($arr_postcode_regexes); var_dump(substr('^\s*(A\s*B\s*3\s*[0-8]\s*[0-9]\s*[A-Z]\s*[A-Z]|A\s*B\s*4\s*[1-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|A\s*B\s*5\s*[0-6]\s*[0-9]\s*[A-Z]\s*[A-Z]|F\s*K\s*1\s*[789]\s*[0-9]\s*[A-Z]\s*[A-Z]|F\s*K\s*2\s*[01]\s*[0-9]\s*[A-Z]\s*[A-Z]|G\s*8\s*3\s*[0-9]\s*[A-Z]\s*[A-Z]|G\s*Y\s*9\s*[0-9]\s*[A-Z]\s*[A-Z]|H\s*S\s*[1-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|I\s*M\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z]|I\s*M\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z]|K\s*A\s*2\s*[89]\s*[0-9]\s*[A-Z]\s*[A-Z]|K\s*W\s*[0-9]\s*[0-9]?\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*A\s*[2-9]\s*[0-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*H\s*1\s*[5-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*H\s*[2-9]\s*[0-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|T\s*R\s*2\s*[1-5]\s*[0-9]\s*[A-Z]\s*[A-Z]|Z\s*E\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z])\s*$'), 0, 128);
based on piVbK
Output for 5.3.0 - 5.6.28, hhvm-3.10.0 - 3.12.0, 7.0.0 - 7.1.0
array(3) { ["uk"]=> string(68) "^\s*([A-Z]\s*[A-Z]?\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z])\s*$" ["offshore"]=> string(738) "^\s*(A\s*B\s*3\s*[0-8]\s*[0-9]\s*[A-Z]\s*[A-Z]|A\s*B\s*4\s*[1-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|A\s*B\s*5\s*[0-6]\s*[0-9]\s*[A-Z]\s*[A-Z]|F\s*K\s*1\s*[789]\s*[0-9]\s*[A-Z]\s*[A-Z]|F\s*K\s*2\s*[01]\s*[0-9]\s*[A-Z]\s*[A-Z]|G\s*8\s*3\s*[0-9]\s*[A-Z]\s*[A-Z]|G\s*Y\s*9\s*[0-9]\s*[A-Z]\s*[A-Z]|H\s*S\s*[1-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|I\s*M\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z]|I\s*M\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z]|K\s*A\s*2\s*[89]\s*[0-9]\s*[A-Z]\s*[A-Z]|K\s*W\s*[0-9]\s*[0-9]?\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*A\s*[2-9]\s*[0-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*H\s*1\s*[5-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*H\s*[2-9]\s*[0-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|T\s*R\s*2\s*[1-5]\s*[0-9]\s*[A-Z]\s*[A-Z]|Z\s*E\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z])\s*$" ["ni"]=> string(59) "^\s*(B\s*T\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z])\s*$" } Warning: substr() expects at least 2 parameters, 1 given in /in/QknVD on line 46 NULL int(0) int(128)
Output for 4.3.0 - 5.2.17
array(3) { ["uk"]=> string(68) "^\s*([A-Z]\s*[A-Z]?\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z])\s*$" ["offshore"]=> string(738) "^\s*(A\s*B\s*3\s*[0-8]\s*[0-9]\s*[A-Z]\s*[A-Z]|A\s*B\s*4\s*[1-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|A\s*B\s*5\s*[0-6]\s*[0-9]\s*[A-Z]\s*[A-Z]|F\s*K\s*1\s*[789]\s*[0-9]\s*[A-Z]\s*[A-Z]|F\s*K\s*2\s*[01]\s*[0-9]\s*[A-Z]\s*[A-Z]|G\s*8\s*3\s*[0-9]\s*[A-Z]\s*[A-Z]|G\s*Y\s*9\s*[0-9]\s*[A-Z]\s*[A-Z]|H\s*S\s*[1-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|I\s*M\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z]|I\s*M\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z]|K\s*A\s*2\s*[89]\s*[0-9]\s*[A-Z]\s*[A-Z]|K\s*W\s*[0-9]\s*[0-9]?\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*A\s*[2-9]\s*[0-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*H\s*1\s*[5-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|P\s*H\s*[2-9]\s*[0-9]\s*[0-9]\s*[A-Z]\s*[A-Z]|T\s*R\s*2\s*[1-5]\s*[0-9]\s*[A-Z]\s*[A-Z]|Z\s*E\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z])\s*$" ["ni"]=> string(59) "^\s*(B\s*T\s*[0-9]\s*[0-9A-Z]?\s*[0-9]\s*[A-Z]\s*[A-Z])\s*$" } Warning: Wrong parameter count for substr() in /in/QknVD on line 46 NULL int(0) int(128)