preg替换所有但长度超过5的数字

时间:2017-12-09 00:49:32

标签: php regex preg-replace preg-match

我有一个字符串:

  

3 pk。预备面团白面包包$ 3.99 - 47500 - 00892,48101

我想只保留长度超过5个字符的数字组,如果可能,请保留它们之间的任何短划线或逗号。

e.g。

  

47500-00892,48101

我的第一步是删除数字组< 4:

  

preg_replace('/ \ d {1,4} /','',$ string);

我的想法是“将任何数字块从1替换为4”,但这并不完全符合我的想法。也许我只是错过了一个运营商?

然后我将除去所有字母和所有标点符号,然后 - 。在我的例子中,我会留下一个起点 - 因为它在一个字符串中,但一个trim()可以很好地清理它。

感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

如果我再耐心等待5分钟,我会找到答案:\ b

出于某种原因,使用数字并不会触发我需要使用'字边界'。

$string = preg_replace('/\b\d{1,4}\b/', '', $string);
$string = preg_replace('/[^0-9-,]/', '', $string);
$string = trim($string, ',-');

答案 1 :(得分:0)

由于没有理由执行替换,您可以使用preg_match_all来获取所需内容并减少结果数组:

$re = '/\d{5,}(?:(?=\s*([-,])\s*\d{5}))?/';
$str = '3 pk. Ready-Dough White Loaves Included $3.99 - 47500 - 00892, 48101';

if ( preg_match_all($re, $str, $matches, PREG_SET_ORDER) ) {
    $result = array_reduce($matches, function ($c,$i) { return $c . implode('', $i); });
    echo $result;
}