Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP从字符串中提取数字_Php_Split_Preg Match_Substr_Preg Split - Fatal编程技术网

PHP从字符串中提取数字

PHP从字符串中提取数字,php,split,preg-match,substr,preg-split,Php,Split,Preg Match,Substr,Preg Split,我想从PHP中的字符串中提取数字,如下所示: 如果字符串='make1to6'我想在整个字符串中提取'to'子字符串前后的数字字符。i、 e.1和6将被提取 我将使用这些返回值进行一些计算。我想提取整个字符串中“to”子字符串前后的数字字符。i、 e.1和6将被提取 字符串的长度不是固定的,最多可以是10个字符。数字最多可以是字符串中“to”两侧的两个数字 一些字符串值示例: sure1to3 ic3to9ltd anna1to6 joy1to4val make6to12 ext12to36

我想从PHP中的字符串中提取数字,如下所示:

如果字符串='make1to6'我想在整个字符串中提取'to'子字符串前后的数字字符。i、 e.1和6将被提取

我将使用这些返回值进行一些计算。我想提取整个字符串中“to”子字符串前后的数字字符。i、 e.1和6将被提取

字符串的长度不是固定的,最多可以是10个字符。数字最多可以是字符串中“to”两侧的两个数字

一些字符串值示例:

sure1to3
ic3to9ltd
anna1to6
joy1to4val
make6to12
ext12to36
想想这样的事情:

function beforeTo(string) {

    return numeric_value_before_'to'_in_the_string;

}


function afterTo(string) {

    return numeric_value_after_'to'_in_the_string;

}
我将使用这些返回值进行一些计算。

您可以使用:

// $str holds the string in question
if (preg_match('/(\d+)to(\d+)/', $str, $matches)) {
    $number1 = $matches[1];
    $number2 = $matches[2];
}

您可以使用正则表达式

$string = 'make1to6';
if (preg_match('/(\d{1,10})to(\d{1,10})/', $string, $matches)) {
    $number1 = (int) $matches[1];
    $number2 = (int) $matches[2];
} else {
    // Not found...
}

这就是正则表达式的用途-您可以匹配非常特定模式的多个实例,并将它们以数组的形式返回给您。说实话,这真是太棒了:)

在这里看一下如何在php中使用内置正则表达式方法:


这里有一个很棒的测试正则表达式的工具:

您可以使用正则表达式,它应该完全符合您的规范:

$string = 'make6to12';
preg_match('{^.*?(?P<before>\d{1,2})to(?P<after>\d{1,2})}m', $string, $match);
echo $match['before'].', '.$match['after']; // 6, 12
$string='make6to12';
preg_match('{^.*?(?P\d{1,2})到(?P\d{1,2})}m',$string,$match);
回声$match['在'].'之前,'.$match['在'.'之后];//6, 12

使用preg\u匹配一个正则表达式,它将为您提取数字。像这样的东西应该能帮到你:

$matches = null;
$returnValue = preg_match('/([\d+])to([\d+])/uis', 'ic3to9ltd', $matches);
在此之后,
$matches
将如下所示:

array (
  0 => '3to9',
  1 => '3',
  2 => '9',
);

你应该读一些关于正则表达式的书,如果你知道它们是如何工作的,那么做这样的事情并不难。会让你的生活更轻松。;-)

您可以使用
preg\u match\u all
实现以下目标:

function getNumbersFromString($str) {
    $matches = array();
    preg_match_all("/([0-9]+)/",$str,$matches);
    return $matches;
}
$matches = getNumbersFromString("hej 12jippi77");


正则表达式在这里似乎真的不必要,因为您所做的只是针对一组字符检查
是否为数值()

您是否尝试过循环遍历每个字符并检查它是否为int()?()哎呀,我没有注意到,
to
部分是必需的=)用一个两位数的字符串进行测试。。。。不使用像“m6to12”这样的两个数字,但适用于“m1to6”。它使用多个数字失败的原因是它使用了
[\\d+]
,这实际上意味着
0-9
+
的一个字符,因此它也会匹配一个真正错误的
+
。简单地写
\d+
将匹配
0-9
中的一个或多个字符,这会更好。这是可行的,但不能验证“to”之前/之后只有1或2个数字,请参阅下面我的答案以获得更严格的方法。@rabusmar-这非常有效。。。但它不验证数字长度是否应为1或2。。。。无论如何,谢谢
function getNumbersFromString($str) {
    $matches = array();
    preg_match_all("/([0-9]+)/",$str,$matches);
    return $matches;
}
$matches = getNumbersFromString("hej 12jippi77");
<?php
list($before, $after) = explode('to', 'sure1to3');

$before_to = extract_ints($before);
$after_to  = extract_ints($after);

function extract_ints($string) {
    $ints = array();
    $len = strlen($string);

    for($i=0; $i < $len; $i++) {
        $char = $string{$i};
        if(is_numeric($char)) {
            $ints[] = intval($char);
        }
    }

    return $ints;
}
?>