$str = "234 567 some text following";
如何从字符串中的第三个字符到最后一个数字获取子字符串?
$positionOfNewLeadingCharacter = 3;
在上面的示例中,我希望4 567
返回子字符串,而不是从第三个字符到字符串末尾。 7
是样本字符串中最后出现的数字。
我实际应用程序中的字符串可能是文本和数字的混合。我需要将子字符串从已知位置提取到最后出现的数字的位置。
$str = "234 567 some text following";
如何从字符串中的第三个字符到最后一个数字获取子字符串?
$positionOfNewLeadingCharacter = 3;
在上面的示例中,我希望4 567
返回子字符串,而不是从第三个字符到字符串末尾。 7
是样本字符串中最后出现的数字。
我实际应用程序中的字符串可能是文本和数字的混合。我需要将子字符串从已知位置提取到最后出现的数字的位置。
你想要:
这当然可以通过一次preg_match()
调用来完成,但是该模式的人类可读性不是很好。
使用substr()
是删除不需要的前导字符的好方法——只要确保起始偏移量永远不会小于零,否则你会得到意想不到的结果。我还没有在我的代码片段中构建多字节支持。
要从第 3 个字符开始,您必须从第 2 个偏移量开始减去 1。
至于从字符串末尾修剪零个或多个 ( *
) 非数字字符 ( \D
),请使用字符串结尾锚 ( $
)。
代码:(演示)
$str = "234 567 some text following";
$start = 3;
var_export(
preg_replace(
'/\D*$/',
'',
substr($str, max($start, 1) - 1)
)
);
输出:
'4 567'
更丑的preg_match()
方式:(演示)
var_export(
preg_match(
'/.{' . max($start - 1, 0) . '}\K.*\d/',
$str,
$match
)
? $match[0]
: 'no match'
);
你应该使用 substr 函数
substr($str, 2);
编辑 :
用正则表达式
$pattern = '/^[0-9]+/';
preg_match($pattern, substr($str, 2), $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
EDIT2:经过测试并且可以正常工作
$pattern = '/^([0-9][ ]*)+/';
preg_match($pattern, substr($str, 2), $matches);
print_r($matches);
EDIT3:没有看到你的最后一个编辑,建立一个新的^^
编辑4:
$str = "234 567 some text 123 22 following 12 something";
$pattern = '/^([ ]*([0-9][ ]*)*([a-zA-Z][ ]*)*[0-9]*)*[0-9]/';
preg_match($pattern, substr($str, 2), $matches);
echo $matches[0];
给我吗4 567 some text 123 22 following 12
这是你所期待的吗?
编辑 5:
又是新的^^
'/^([0-9 :._\-]*[a-zA-Z]*[:._\-]*)*[0-9]/'
尝试这个:
substr($str,2,strlen($str));
编辑(新答案):
此代码有效:
$str = preg_replace( "/\D/", "", $str);
echo substr($str,2);
<?php
$subStr = substr($str, 2);
?>
默认情况下,长度(第三个参数)在省略时将默认为字符串的末尾。请注意,字符从 0 开始,因此第三个字符将位于位置 2。
您可以通过在正则表达式中使用负前瞻来做到这一点。
<?php
$lastNumber = getLastNumber("234 567 some text following");
var_dump($lastNumber);
function getLastNumber($string) {
preg_match("/[0-9](?!.*[0-9])/", $string, $match);
if (!empty($match[0])) return $match[0];
return false;
}
?>
编辑:对不起,我看错了;以为你想要最后一个独立号码。
双重编辑:这似乎做你想做的事
<?php
$string = substr("234 567 some text 123 22 following", 2);
preg_match("/[0-9 ]+/", $string, $matches);
if (!empty($matches)) {
$number = intval(str_replace(" ", "", $matches[0]));
var_dump($number);
}
?>
因为它返回“4567”。当然,如果您想要保留空间,只需使用$matches[0]
而不是$number
.
我只是偶然发现了这一点,并认为我会分享我的解决方案。
<?php
$string = "234 567 some text following";
$start = 2;
if(preg_match_all('/\d+/', $string, $sub)){
$lastNumber = end($sub[0]);
$newString = substr($string,$start, strrpos($string, $lastNumber) + strlen($lastNumber) - $start);
}
echo $newString;
此行获取字符串中的所有数字
if(preg_match_all('/\d+/', $string, $sub))
在这里我们获取最后一个数字
$lastNumber = end($sub[0]);
然后我们找到最后一次出现的数字,strrpos
以防最后一个数字多次出现。然后,使用该位置提取从起始位置到最后一个数字的子字符串:
$newString = substr($string,$start, strrpos($string, $lastNumber)
+ strlen($lastNumber) - $start);