仅返回空格前的数字

3

我使用preg_match PHP函数仅提取空格破折号和另一个空格(-)之前的数字。

我的所有主题都有一个数字,然后是一个小描述,就像这样;

3546425 - 小描述

我只需要数字;

3546425

我尝试了这个表达式,但它只返回一个值; 1

/([0-9])(.+?(?= - ))/

这是我的PHP代码;

$pattern = '/([0-9])(.+?(?= - ))/';
$subject = '3546425 - Small description';

echo preg_match($pattern, $subject);

我可以使用PHP的subtr函数,但是第一个空格之前的数字长度不总是相同的,它可能会更短或更长,这时候它就不能正常工作。
有人能解释一下问题出在哪里吗?因为我已经在这里测试过了,它可以像我想要的那样准确标识整个数字。

1
既然您知道所有字符串开头都有一个数字,那么explode(" - ", $s)[0]怎么样?如果字符串格式未知,则正则表达式更好。 - Wiktor Stribiżew
1
问题在于 preg_match() 函数会返回 1,如果模式匹配给定的主体,则返回0,如果不匹配则返回 FALSE,如果发生错误也会返回 FALSE。 - Mr Rubix
3个回答

3
如果你想让它变得非常简单且你的字符串总是以数字开头,那么你可以直接将其类型转换:
$string = "3546425 - Small Description";
$number = intval($string);

1
我喜欢这个程序的简单易用。谢谢。 - user3599441

2
这里有两个问题:
1)preg_match()函数会返回1,如果模式匹配到了给定的主题,返回0代表没有匹配成功,FALSE代表发生了错误。所以如果你echo preg_match,它的值将是0或1。 2)你需要添加一个输出参数($matches),$matches是一个匹配数组,所以你需要在这个数组中echo一个匹配项!
$pattern = '/([0-9])(.+?(?= - ))/';
$subject = '3546425 - Small description';
preg_match($pattern, $subject, $matches);
echo $matches[0];

ONLINE EXAMPLE


1
感谢您解释得很清楚!我看到还有其他更简单的方法可以做到这一点。但我现在明白为什么它会返回1,以及我必须使用 $matches 了。 - user3599441

0
使用这个正则表达式(\d+)(末尾有空格),然后获取第1组元素。
您可以在regex101.com上检查此正则表达式。

enter image description here


1
在这里不需要任何捕获组,因为匹配值在第0组中。只需使用preg_match\d+就足够了。 - Wiktor Stribiżew
@WiktorStribiżew 的 group 0 匹配了数字和末尾的空格。但 Mentos93 只需要数字。 - solomkinmv
(\d+) 也只显示为一 (1)。 - user3599441
1
^\d+不带空格可以满足所有需求:无需匹配空格,整个结果即为所期望的数字。 - Aaron
@Aaron 你的方法也可以。我的方法更为通用。 - solomkinmv
这些方法中哪一个更通用呢?其中一个假设数字在文本开头,而另一个假设数字后面跟着一个空格。无论如何,你说得对,我的解决方案并不更好。由OP决定哪个条件最可靠,以及当它不匹配时发生的情况是否有问题。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接