如何使用preg_match
从字符串中选择两个数字?
我之前使用过preg_match
来仅选择<iframe>
和#
标记。
例如,我需要在等式中选择两个数字:
“什么是23x347?” 并给我一个输出变量:
$first_number = 23
$seccond_number = 347
list($first_number, $second_number) = preg_split("/x/",$message);
但是它不会删除之前或之后的非数字文本。
答案 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)
正则表达式的快速解释:
可选的空格匹配允许使用&#34; 2 * 2&#34;或&#34; 2 * 2&#34;
答案 1 :(得分:0)
使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
)