这是一个简单的问题,但是我浪费了太多时间试图自己解决这个问题。
我将数据存储在具有模式r{N}-{N}s{N}
的字符串中,其中{N}是一位或两位数字。此模式最多可重复5次。我需要从模式中提取数字,最好以某种方式分组。
例如,如果字符串为"r4-10s5"
,我想提取{4,10,5}
如果字符串为"r4-10s5r6-7s8"
,我想提取{4,10,5} {6,7,8}
我怎样才能在PHP中完成这项工作?
我尝试过使用递归正则表达式,但我无法让它们正确匹配。
答案 0 :(得分:1)
静态模式是: r -
s
,空白点只能是数字
/r(\d{1,2})-(\d{1,2})s(\d{1,2})/
=>在这里测试:http://regex101.com/r/sH4sY0
\d{1,2}
连续匹配1位或2位数
答案 1 :(得分:1)
$str = "r4-10s5r6-7s8";
preg_match_all("#r(\d{1,2})-(\d{1,2})s(\d{1,2})#", $str, $matches);
// group the matches together
$sets = array();
for ($i = 0, $count = count($matches[0]); $i < $count; $i++)
$sets[] = array($matches[1][$i], $matches[2][$i], $matches[3][$i]);
print_r($sets);
输出:
array (size=2)
0 =>
array (size=3)
0 => string '4' (length=1)
1 => string '10' (length=2)
2 => string '5' (length=1)
1 =>
array (size=3)
0 => string '6' (length=1)
1 => string '7' (length=1)
2 => string '8' (length=1)
没有循环的另一个选项是:
preg_match_all("#r(\d{1,2})-(\d{1,2})s(\d{1,2})#", $str, $matches, PREG_SET_ORDER);
print_r($matches);
输出:
array (size=2)
0 =>
array (size=4)
0 => string 'r4-10s5' (length=7)
1 => string '4' (length=1)
2 => string '10' (length=2)
3 => string '5' (length=1)
1 =>
array (size=4)
0 => string 'r6-7s8' (length=6)
1 => string '6' (length=1)
2 => string '7' (length=1)
3 => string '8' (length=1)
答案 2 :(得分:-1)
我就是这样做的:
function extractNumbers($string, $multiples = 3, $strict = false) {
$string = preg_replace('/\D+/', ' ', trim($string));
$array = explode(' ', trim($string));
$count = count($array);
$remove = ($count % $multiples);
if ($remove > 0) {
// Strict, do not allow dangling numbers
if ($strict) {
return null;
}
$array = array_slice($array, 0, ($count - $remove));
}
$array = array_map('intval', $array);
return array_chunk($array, $multiples);
}
$str = 'r4-10s5r6-7s8';
var_dump(extractNumbers($str));
它可能不是很优雅,但它相对容易理解和维护。