php string explode on(-)characters

30byixjq  于 2023-10-15  发布在  PHP
关注(0)|答案(5)|浏览(116)

我有一个这样的字符串:
$string = "small (150 - 160)"
有没有一种方法可以在变量$min中存储150,在变量$max中存储160?

9fkzdhlc

9fkzdhlc1#

function minMax($string) {
  $digits = explode("-", $string);
  return filter_var_array($digits, FILTER_SANITIZE_NUMBER_INT);
}

// $yourString = "small (150 - 160)"
$values = minMax( $yourString );
$min = $values[0]; $max = $values[1];

该函数使用explode删除“-”并创建一个数组。“-”左边的字符串放在$digits[0]中,右边的放在$digits[1]中。
然后使用PHP过滤器从数组字符串中删除非整数字符。注意,我假设你正在处理整数。filter_var_array不能处理小数点,但是你可以使用filter_varFILTER_SANITIZE_NUMBER_FLOAT标志来保留小数点。

function minMax($string) {
  return filter_var($string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
}

$values = minMax( "small (150 - 160.4)" );
$number = explode("-", $values);
$min = $number[0]; $max = $number[1];

在十进制的例子中,紧挨着上面的任何“.”都将被保留。如果字符串可以包含非数字句点,那么您需要从输出中删除前导“.”,例如。if string = “big.(150 - 160.4)" 则$min将包含'.150'以防止前导周期$min = trim($min,'.');

8ftvxx2r

8ftvxx2r2#

下面的PHP脚本将解决您的问题:

$string = "small (150 - 160)";
$tmp = preg_replace("/[^0-9\.]/", " ", $string);
$tmp = trim(preg_replace('/\s+/u', ' ', $tmp));
$tmp = explode(' ', $tmp);

$min = $tmp[0];
$max = $tmp[1];
l7mqbcuq

l7mqbcuq3#

<?php

$string = "small (150 - 160)";
$string = preg_replace('/[^\d-]/', '', $string); // replace everything not a digit and not a "-" with empty string ('')
list( $min, $max ) = explode('-', $string); // split by "-" and store in $min and $max

var_dump( $min);
var_dump( $max );

输出

string(3) "150"
string(3) "160"
mzsu5hc0

mzsu5hc04#

对于sscanf()来说,解析一个没有可选字符的可预测格式的字符串是一个很好的任务。比preg_函数更好的是,如果format参数包含%d%f,那么隔离的nueric子串将被转换为整数或浮点数(分别)。*符号是一个捕获抑制器--意味着匹配的子字符串不会被分配给变量。
代码:(Demo

$string = "small (150 - 160)";

sscanf($string, '%*[a-z] (%d - %d)', $min, $max);

var_export([$min, $max]);

输出(int型值):

array (
  0 => 150,
  1 => 160,
)
luaexgnf

luaexgnf5#

preg_match_all('!\d+!', $string, $matches);
var_dump($matches);

相关问题