Php Regex删除非数字字符,但不删除字符串开头的字符

Php Regex删除非数字字符,但不删除字符串开头的字符,php,regex,Php,Regex,我需要构造一个正则表达式(preg_replace)来删除字符串中的所有非数字字符,但如果它们出现在字符串的开头,则不需要。我通常非常擅长构造正则表达式,但这一次真的让我大吃一惊 OK字符串遵循以下模式: ^(SI?)?\d+$ 例如:SI234965305843453 如果我给它这个字符串:S234--9Sptreccc6543453 然后,preg\u replace应返回: S23496543453您可以尝试使用以下基于反向查找的正则表达式来匹配所有非数字字符,但不能匹配开头的字符 (?

我需要构造一个正则表达式(
preg_replace
)来删除字符串中的所有非数字字符,但如果它们出现在字符串的开头,则不需要。我通常非常擅长构造正则表达式,但这一次真的让我大吃一惊

OK字符串遵循以下模式:

^(SI?)?\d+$
例如:
SI234965305843453

如果我给它这个字符串:
S234--9Sptreccc6543453
然后,
preg\u replace
应返回:


S23496543453

您可以尝试使用以下基于反向查找的正则表达式来匹配所有非数字字符,但不能匹配开头的字符

(?<!^)\D
输出:

S234965305843453
S23496543453
5492353ffsdkfjsd5345

没有lookaheads,您可以使用此简单的匹配组和反向引用:

$str = preg_replace('/(.)\D+/', '$1', $str);
//=> S23496543453


()
\D+
之前,将确保
\D+
在开始时不匹配。

为什么不将keep-only digits正则表达式应用于
子字符串($u变量,1)
和concat?非常干净,具有负向后看功能!我不认为你能做得更简单:如何确保字符串开头同时包含“SI”和“S”?你说的不是开头的字符。@silkfire我不知道你上面的评论到底是什么意思。发布一个示例以及预期的输出。是否要对以
S
SI
开头的字符串进行替换?@AvinashRaj如果看到我的正则表达式,有效的序列如下所示:
^(SI?)\d+$
,也就是说,初始'S'之后的字母'i'是可选的,'SI'也是可选的,但是连续剧不能只以“我”开头。
S234965305843453
S23496543453
5492353ffsdkfjsd5345
$str = preg_replace('/(.)\D+/', '$1', $str);
//=> S23496543453