【问题标题】:Regex - remove non-5 digit zips from a string正则表达式 - 从字符串中删除非 5 位数的拉链
【发布时间】:2015-10-13 18:32:31
【问题描述】:

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

11111 22222 33333 44444 55555 等

如果客户输入 11111、22222、33333、55555 或其他不是 5 个数字(数字)后面或前面有 1 个可选空格的内容,我希望它删除坏的并留下正确的

因此,例如,如果有人输入 11111 2222A 33333,它应该只返回 11111 33333,或者如果他们输入 11111、22222、33333,它应该返回 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 位数字的内容(可选,因此它匹配字符串中的第一个邮政编码和结尾的邮政编码),从而有效地删除它们。

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

【问题讨论】:

    标签: php regex


    【解决方案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
    

    【讨论】:

    • 不知道 preg_match_all,非常好,正是我想要的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多