正则表达式 - 从字符串中删除非5位数的拉链

时间:2015-10-13 18:32:32

标签: php regex

我的邮政编码字符串需要如下所示:

11111 22222 33333 44444 55555等。

如果客户输入11111,22222,333333,5555或其他任何不是5个数字(数字)后面或前面有1个可选空格的东西,我希望它删除坏的并留下正确的空格

所以,例如,如果有人输入11111 2222A 33333,它应该只返回11111 33333,或者如果他们输入11111,22222,333333,它应该返回11111 22222 33333.我还希望它返回正确,如果他们做11111,22222,33333,但我知道如何用空格替换逗号我认为我可以单独检查

到目前为止,我的正则表达式测试是:

$data = '11111 2222A 33333';
// Attempt 1
$x = preg_replace('/^([\s]*\d{5})+[\s]*$/','',$data);

// Attempt 2
$y = preg_replace('/[^\s?(?=\d{5})(?=\s?)*]/','',$data);
$x = preg_replace('/!\d{5}\s?/','',$y);

// Attempt 3
$x = preg_replace('/[^\b\d{5}\b\s]/','',$data);

return $x;

我试图替换那些不匹配5位数后面或前面有空格的东西(可选,因此它匹配字符串中的第一个zipcodes和结尾的zipcodes),没有任何东西,有效地删除它们。

但到目前为止它所做的只是删除2222A中的A并离开2222.一次只会有一次尝试被注释掉。

1 个答案:

答案 0 :(得分:1)

我建议使用preg_match_all,然后选择implode来电:

$s = '11111, 22222, 33333'
preg_match_all('/\b\d{5}\b/', $s, $m);
echo implode(' ', $m[0]);
//=> 11111 22222 33333

$s = '11111,22222,33333'
preg_match_all('/\b\d{5}\b/', $s, $m);
echo implode(' ', $m[0]);
//=> 11111 22222 33333

$s = '11111,2222A,33333'
preg_match_all('/\b\d{5}\b/', $s, $m);
echo implode(' ', $m[0]);
//=> 11111 33333