我需要构造一个正则表达式(preg_replace
)来从字符串中删除所有非数字字符,但如果它们在开头出现则不需要。我通常非常擅长构建正则表达式,但这个让我感到沮丧。
一个好的字符串遵循这种模式:
^(SI?)?\d+$
例如:SI234965305843453
所以,如果我给它这个字符串:S234---9Sptreccc6543453
那么preg_replace
应该返回:
S23496543453
答案 0 :(得分:3)
如果没有预测,您可以使用这个简单的匹配组和反向引用:
$str = preg_replace('/(.)\D+/', '$1', $str);
//=> S23496543453
在(.)
之前 \D+
将确保\D+
在开始时不匹配。
答案 1 :(得分:1)
您可以尝试使用以下基于负面lookbehind的正则表达式匹配所有非数字字符,但不能匹配开头的字符。
(?<!^)\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