如何使用preg_match
从字符串中选择两个数字?我以前使用过preg_match
来只选择<iframe>
和#
标记。例如,我需要在一个等式中选择两个数字:
"23x347是什么?"给我一个这样的输出变量:
$first_number = 23
$seccond_number = 347
list($first_number, $second_number) = preg_split("/x/",$message);
工作,但它不会删除之前或之后的非数字文本。
如果将中间的运算符匹配为数学符号,则可以将其传递给另一个函数,然后可以计算几种表达式类型:加法、减法等
简单预匹配(_M)
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"
您可以通过两种方式来实现。preg_split将是最简单的,但preg_match也可以,它只是需要更多的工作。
预拆分
$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
)
预匹配
$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
)