Php 仅捕获以';开头的字符串中的数字;s';

Php 仅捕获以';开头的字符串中的数字;s';,php,regex,Php,Regex,我想从这个字符串中提取所有数字:“s_0a1f2d4e3c10b”。字符串必须遵循此模式的\u numberletter numberletter…' 我编写了一个与整个字符串匹配的正则表达式: /^q_(?:\d+[a-f])+$/ 问题是我不知道如何只捕捉数字。当我将括号括在\d+上时,正则表达式只匹配最后一个数字(10)。 以下是带括号的正则表达式: ^q_(?:(\d+)[a-f])+$ 当然我可以使用preg\u match\u all('/\d+/','s\u 0a1f2d4e3

我想从这个字符串中提取所有数字:“s_0a1f2d4e3c10b”。字符串必须遵循此模式的\u numberletter numberletter…' 我编写了一个与整个字符串匹配的正则表达式:

/^q_(?:\d+[a-f])+$/
问题是我不知道如何只捕捉数字。当我将括号括在\d+上时,正则表达式只匹配最后一个数字(10)。 以下是带括号的正则表达式:

^q_(?:(\d+)[a-f])+$

当然我可以使用
preg\u match\u all('/\d+/','s\u 0a1f2d4e3c10b',$matches)
但是我希望字符串以's\u'开头,并且我只希望使用一个正则表达式(如果可能)。

您可以使用preg\u替换,如下所示:

$count = null;
$returnValue = preg_replace('/[^0-9]+/', '', 's_0a1f2d4e3c10b', -1, $count);
这将从字符串中删除所有非数字字符


$returnValue
将包含
'0124310'
$count
将包含
7
(删除的字符数)

您可以使用preg\u replace,如下所示:

$count = null;
$returnValue = preg_replace('/[^0-9]+/', '', 's_0a1f2d4e3c10b', -1, $count);
这将从字符串中删除所有非数字字符


$returnValue
将包含
'0124310'
$count
将包含
7
(删除的字符数)

不确定您要的是哪一个结果,因为您似乎希望保留s,但将数字(而不是数字)分隔成值。它要么是字符串,要么是数字列表,而不是两者都是

preg\u match\u all('/s\ud+\d+/'、's\u0a1f2d4e3c10b'、$matches)
将返回一个数组,第一个值在开头保留
s

preg\u match\u all('/s\ud+\d+/',s\u 0a1f2d4e3c10b',$matches)
将返回一个数组,第一个值仅为
s\ucode>,随后的值为数字。

您建议的
preg\u match\u all('/\d+/','s\u 0a1f2d4e3c10b',$matches)
将只返回数组中的数字,如果将它们连接到字符串,您可以添加
s\u
前缀

不确定您要的是哪一个结果,因为您似乎希望保留s_,但将数字(而不是数字)分隔成值。它要么是字符串,要么是数字列表,而不是两者都是

preg\u match\u all('/s\ud+\d+/'、's\u0a1f2d4e3c10b'、$matches)
将返回一个数组,第一个值在开头保留
s

preg\u match\u all('/s\ud+\d+/',s\u 0a1f2d4e3c10b',$matches)
将返回一个数组,第一个值仅为
s\ucode>,随后的值为数字。

您建议的
preg\u match\u all('/\d+/','s\u 0a1f2d4e3c10b',$matches)
将只返回数组中的数字,如果将它们连接到字符串,您可以添加
s\u
前缀

有几种方法可以实现这一点,但其核心是,这对以下人员来说是一项伟大的工作:

如果限定子字符串存在于较大的字符串中,则需要额外的步骤来提取限定的混合字符子字符串,然后再拆分为所需的输出数组

代码():

*当然,如果您想使用基于正则表达式的函数进行准备,可以根据您的情况使用以下选项之一():


如果您只处理限定字符串,则可以:

代码():


有几种方法可以实现这一点,但其核心是,这对以下人员来说是一项伟大的工作:

如果限定子字符串存在于较大的字符串中,则需要额外的步骤来提取限定的混合字符子字符串,然后再拆分为所需的输出数组

代码():

*当然,如果您想使用基于正则表达式的函数进行准备,可以根据您的情况使用以下选项之一():


如果您只处理限定字符串,则可以:

代码():


非常感谢你的回答。但我不明白如何将这些数字分割成数字,我的意思是,现在10可以被视为1和a0@winapiwrapper您在最初的帖子中没有指定您想要一个包含字符串中的数字的数组(您在收到评论后澄清了该数组),因此,我的建议是一种获取字符串的方法,其中删除了所有非数字字符,这是根据我在您最初发布文章时对您要求的理解。不管怎样,你现在似乎已经解决了你的问题,所以现在一切都很好,我建议你接受其他对你帮助最大的答案之一:-)非常感谢你的回答。但我不明白如何将这些数字分割成数字,我的意思是,现在10可以被视为1和a0@winapiwrapper您在最初的帖子中没有指定您想要一个包含字符串中的数字的数组(您在收到评论后澄清了该数组),因此,我的建议是一种获取字符串的方法,其中删除了所有非数字字符,这是根据我在您最初发布文章时对您要求的理解。无论如何,您现在似乎已经解决了问题,所以现在一切都很好,我建议您接受其他对您帮助最大的答案之一:-)如果正则表达式工作正常,您希望得到什么样的输出<代码>字符串“s_012310”
数组(0,1,2,3,10)
或其他东西?第二个:数组(0,1,2,3,10)是
s_0a1f2d4e3c10b
提供给
preg_match_all()
?或者有一个更大的字符串包含它,比如:
这是字符串s_0a1f2d4e3c10b等等。
?请提供一些输入样本以及每个输入样本所需的输出。这不仅有助于回答者,也有助于所有未来的SO访问者。如果正则表达式工作正常,您希望得到什么样的输出<代码>字符串“s_012310”
数组(0,1,2,3,10)
或其他东西?第二个:数组(0,1,2,3,10)是
s_0a1f2d4e3c10b
提供的整个字符串
$mixed=preg_match('/s_\K[^ ]+/',$in,$out)?$out[0]:'';  // 0a1f2d4e3c10b
$mixed=preg_match_all('/s_\K[^ ]+/',$in,$out)?$out[0][0]:'';  // 0a1f2d4e3c10b
$in='s_0a1f2d4e3c10b';
$array=preg_split('/[^\d]+/',$in,null,PREG_SPLIT_NO_EMPTY);
var_export($array);
// $array=['0','1','2','4','3','10']