2015-12-21 79 views
0

如何使用preg_match从字符串中选择两个数字? 我之前使用preg_match来只选择和#标记。 例如我需要选择方程中的两个数字:从字符串中选择两个数字

“whats 23x347?” 并给我一个输出变量这样:但是

$first_number = 23 
$seccond_number = 347 

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

工作不前或后删除非数字文本。

+1

可能重复[使用preg \ _match从字符串获取数字](http://stackoverflow.com/questions/15408673/get-numbers-from-string-using -preg-match) – wogsland

+0

只是为了识别'x'?关于'-','+','/'等等呢?或“344sometext654”? – AdamJeffers

+0

我已经有一个脚本来选择这样的功能。我只需要在'x'之前选择第一部分数字,然后在'x'后选择第二部分数字 –

回答

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将填充$匹配阵列

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

非常感谢!这工作得很好,preg_split之一。 只是一个问题,我注意到它并没有将最后一个数字与文本分开? 如果我有23x347? 它会回显1st:23 2nd:347? –

+0

啊,这是可以做到的,但你必须为此使用不同的正则表达式。这不是原始问题的一部分,所以我没有回答这个问题。 – jbrahy

+0

我已更新问题 –

2

如果匹配在中间作为一个数学符号运算符,你可以传递到另一个功能,然后能够评估几种表达类型:添加,替换等。

Si mple的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或多个空格,比赛,但没有捕获
  • 第三括号匹配和捕捉一个或多个数字

可选的空间匹配允许短语像“2 * 2”或“2 * 2”