如何使用PHP中的正则表达式从String中提取某个数字?

时间:2012-10-22 20:32:43

标签: php regex

我有一个字符串(文件名):s_113_2.3gp

如何提取第二个下划线后出现的数字?在这种情况下它是'2'但在某些情况下可以是几位数。

第一个下划线后出现的位数也可能不同,因此该String的长度不是恒定的。

2 个答案:

答案 0 :(得分:6)

您可以使用捕获组:

preg_match('/_(\d+)\.\w+$/', $str, $matches);
$number = $matches[1];

\d+代表1位或更多位数字。围绕它的括号捕获它,以便稍后可以使用$matches[1]检索它。 .需要进行转义,否则它会匹配任何字符,但会换行。 \w+匹配1个或多个单词字符(数字,字母,下划线)。最后$代表字符串的结尾并“锚定”正则表达式(否则你会遇到包含多个.的字符串的问题。)

这也允许任意文件扩展名。

正如Ωmega在下面指出的,还有另一种可能性,即不使用捕获组。使用lookarounds的概念,您可以避免在开始时与_匹配,在结尾时避免匹配\.\w+$

preg_match('/(?<=_)\d+(?=\.\w+$)/', $str, $matches);
$number = $matches[0];

但是,在应用这个相当小的优化之前,我会建议进行性能分析。但要记住这一点(或者更确切地说,阅读!)。

答案 1 :(得分:2)

使用正则表达式查找它是非常短的代码:

$n = preg_match('/(?<=_)\d+(?=\.)/', $str, $m) ? $m[0] : "";

...其中包含:找到一个或多个位于下划线\d+和句点(?<=_)之间的数字(?=\.)