从字符串中选择两个数字

时间:2015-12-21 19:59:39

标签: php select

如何使用preg_match从字符串中选择两个数字? 我之前使用过preg_match来仅选择<iframe>#标记。 例如,我需要在等式中选择两个数字:

  “什么是23x347?”   并给我一个输出变量:

$first_number = 23
$seccond_number = 347

list($first_number, $second_number) = preg_split("/x/",$message);

但是它不会删除之前或之后的非数字文本。

2 个答案:

答案 0 :(得分:2)

如果您将中间的运算符与数学符号匹配,则可以将其传递给另一个函数,然后能够评估几种表达式类型:加法,减法等。

简单的preg_match

preg_match("/(\d+)\s*?(\*|\.|x|\-|\+|\/|\%|\^)\s*?(\d+)/", $str, $matches)

在某些功能中使用正则表达式

function parseExpression($str='')
{
    if (preg_match("/(\d+)\s*?(\*|\.|x|\-|\+|\/|\%|\^)\s*?(\d+)/", $str, $matches)) {
        $number_1 = $matches[1];
        $operator = $matches[2];
        $number_2 = $matches[3];

        return calculate($number_1, $operator, $number_2);
    }

    return false;
}

function calculate($number_1, $operator, $number_2)
{
    if ($operator === 'x' || $operator === '*' || $operator === '.') {
        return $number_1 * $number_2;
    } elseif ($operator === '-') {
        return $number_1 - $number_2;
    } elseif ($operator === '+') {
        return $number_1 + $number_2;
    } elseif ($operator === '/') {
        return $number_1 / $number_2;
    } elseif ($operator === '%') {
        return $number_1 % $number_2;
    } elseif ($operator === '^') {
        return pow($number_1, $number_2);
    } else {
        return false;
    }
}

echo var_dump(parseExpression('23x347')); // int(7981)
echo var_dump(parseExpression('8.8')); // int(64)
echo var_dump(parseExpression('23*347')); // int(7981)
echo var_dump(parseExpression('23-347')); // int(-324)
echo var_dump(parseExpression('8/3')); // float(2.6666666666667)
echo var_dump(parseExpression('8%7')); // int(1)
echo var_dump(parseExpression('2^2')); // int(4)
echo var_dump(parseExpression('2 ^ 2')); // int(4), whitespace ok
echo var_dump(parseExpression('')); // bool(false)
echo var_dump(parseExpression()); // bool(false)
echo var_dump(parseExpression('1')); // bool(false)
echo var_dump(parseExpression('0')); // bool(false)
echo var_dump(parseExpression(1)); // bool(false)
echo var_dump(parseExpression('whats 23x347?')); // int(7981)

正则表达式的快速解释:

  • 第一个括号匹配并捕获一个或多个数字
  • 0个或更多空格,匹配但没有捕获
  • 第二个括号匹配并从列表中捕获一个数学运算符,注意特殊字符的反斜杠转义
  • 0个或更多空格,匹配但没有捕获
  • 第三个括号匹配并捕获一个或多个数字

可选的空格匹配允许使用&#34; 2 * 2&#34;或&#34; 2 * 2&#34;

答案 1 :(得分:0)

你可以用两种方式做到这一点。 preg_split是最简单的,但preg_match也可以工作,这只是一点点工作。

使preg_split

$equation = "23x347";
list($first_number, $second_number) = preg_split("/x/",$equation);
print_r(array('first_number' => $first_number, 'second_number' => $second_number));

preg_split会将这两个值作为单独的列表元素返回。

Array
(
    [first_number] => 23
    [second_number] => 347
)

的preg_match

$equation = "23x347?";
list($first_number, $second_number) = preg_match("/(\d+)x(\d+).*/",$equation);
print_r($matches);

preg_match会填充$ matches数组

Array
(
    [0] => 3x347?
    [1] => 23
    [2] => 347
)