0
$str = "234 567 some text following";

如何从字符串中的第三个字符到最后一个数字获取子字符串?

$positionOfNewLeadingCharacter = 3;

在上面的示例中,我希望4 567返回子字符串,而不是从第三个字符到字符串末尾。 7是样本字符串中最后出现的数字。

我实际应用程序中的字符串可能是文本和数字的混合。我需要将子字符串从已知位置提取到最后出现的数字的位置。

4

6 回答 6

1

你想要:

  1. 通过指定应该成为新的第一个字符的字符的偏移量来从字符串的前面删除字符
  2. 从字符串末尾删除零个或多个非数字字符。

这当然可以通过一次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'
);
于 2021-10-16T07:41:50.600 回答
0

你应该使用 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]/'
于 2012-05-14T10:24:49.657 回答
0

尝试这个:

substr($str,2,strlen($str));

编辑(新答案):

此代码有效:

$str = preg_replace( "/\D/", "", $str);
echo substr($str,2);
于 2012-05-14T10:25:39.583 回答
0
<?php
  $subStr = substr($str, 2);
?>

默认情况下,长度(第三个参数)在省略时将默认为字符串的末尾。请注意,字符从 0 开始,因此第三个字符将位于位置 2。

于 2012-05-14T10:25:45.163 回答
0

您可以通过在正则表达式中使用负前瞻来做到这一点。

<?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.

于 2012-05-14T10:36:09.010 回答
0

我只是偶然发现了这一点,并认为我会分享我的解决方案。

<?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);
于 2015-09-11T02:34:42.687 回答