我需要构造一个正则表达式(preg_replace
)来从字符串中删除所有非数字字符,但如果它们出现在开头,则不需要。我通常非常擅长构造正则表达式,但这一次真的让我措手不及。
一个OK字符串遵循以下模式:
^(SI?)?'d+$
例如:SI234965305843453
如果我给它一个字符串:S234---9Sptreccc6543453
则CCD_ 4应返回:
S23496543453
没有lookahead,您可以使用这个简单的匹配组和反向引用:
$str = preg_replace('/(.)'D+/', '$1', $str);
//=> S23496543453
RegEx演示
'D+
之前的(.)
将确保'D+
在开始时不匹配。
您可以尝试以下基于反向查找的regex来匹配所有非数字字符,但不能匹配开头的字符。
(?<!^)'D
(?<!^)
否定查找,它断言要匹配的字符前面不会有行锚的开头。
演示
echo preg_replace('~(?<!^)'D~', '', 'S234---9Sptreccc6543453');
//=> S23496543453
更新:
仅在以S
或SI
开头的线路上进行更换。
$str = <<<EOT
SI234965305843453
S234---9Sptreccc6543453
5492353ffsdkfjsd5345
EOT;
echo preg_replace('~((?:^SI?|'G)'d*)[^'n'd]~m', ''1', $str);
输出:
S234965305843453
S23496543453
5492353ffsdkfjsd5345
演示