preg_replace如何删除除字母数字之外的所有数字

时间:2019-06-11 22:51:37

标签: php regex

如何删除除字母数字之外的所有数字,例如,如果我有这样的字符串:

Abs_1234abcd_636950806858590746.lands

变得像这样

Abs_1234abcd_.lands

3 个答案:

答案 0 :(得分:1)

在此特定示例中,我们可以简单地将_用作左边界,将.用作右边界,收集数字并替换:

测试

$re = '/(.+[_])[0-9]+(\..+)/m';
$str = 'Abs_1234abcd_636950806858590746.lands';
$subst = '$1$2';

$result = preg_replace($re, $subst, $str);

echo $result;

Demo

答案 1 :(得分:1)

可能是这样完成的

找到(?i)(?<![a-z\d])\d+(?![a-z\d])
一无所有。

解释:
请务必注意,在断言中的类[a-z\d]中,
存在一个数字,没有这个数字可以让“ abc9 0123 4def”匹配。

 (?i)                   # Case insensitive
 (?<! [a-z\d] )         # Behind, not a letter nor digit
 \d+                    # Many digits
 (?! [a-z\d] )          # Ahead, not a letter nor digit

注意-存在更快的版本(?i)\d(?<!\d[a-z\d])\d*(?![a-z\d])


Regex1:   (?i)\d(?<!\d[a-z\d])\d*(?![a-z\d])
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   2
Elapsed Time:    0.53 s,   530.56 ms,   530564 µs
Matches per sec:   188,478


Regex2:   (?i)(?<![a-z\d])\d+(?![a-z\d])
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   2
Elapsed Time:    0.91 s,   909.58 ms,   909577 µs
Matches per sec:   109,941

答案 2 :(得分:1)

对于示例数据,还不能使用字符类来匹配单词字符或下划线[\W_]。然后忘记使用\K匹配的内容。

将要替换的1个以上的数字替换为空字符串,并断言右侧的内容不是单词字符或下划线。

[\W_]\K\d+(?=[\W_])

Regex demo