我需要检查一个带有php的ajax帖子的字符串,特别是源代码是这种格式的文本区域:
[minute]:[price]
[minute]:[price]
[minute]:[price]
示例:
10:20
12:22.23
20:30.1
等等,分钟是一个整数,价格可能是0到2位小数的浮点数(10,10.0,10.00很好),我只能用一种简单的方式检查它们:double explode( “\ n”和“:”)和is_number + float在子元素上,但它看起来很不方便,有人可以建议我使用preg_match
表达式吗?
答案 0 :(得分:1)
preg_match(/\d{1,}:\d{1,}([.][0-9]{1,})?/s);
答案 1 :(得分:1)
这可能是你想要的:
$re = '/[\d]{1,2}\:[\d]{1,2}(?:\.[\d]{1,2})?/m';
$str = "12:22\n12:22.23\n12:22.23";
preg_match_all($re, $str, $matches); //This catch only correct values
echo "<pre>";
foreach($matches[0] as $value){
$split = explode(":", $value);
$minute = intval($split[0]);
$price = floatval($split[1]);
echo "minute -> " . $minute . " value -> " . $price . "\n";
}
表达式/[\d]{1,2}\:[\d]{1,2}(?:\.[\d]{1,2})?/m
捕获类似12:12.12
的模式。见Regex101 example
preg_match_all($pattern, $subject, $matches)执行全局正则表达式匹配并将匹配项放入$ matches数组。
intval($split[0]);floatval(split[1]);
将确保值的格式正确。
答案 2 :(得分:0)
阅读完答案后:
/^(\d){1,}?\:(\d){1,}(?:\.(\d){1,2})?$/mi
这是完整的功能:
preg_match_all(' /^(\d){1,}?\:(\d){1,}(?:\.(\d){1,2})?$/mi', $_POST['ratetable'], $out);
if($out[0]!=explode("\n",$_POST['ratetable'])){
header('Content-Type: application/json; charset=utf-8');
echo json_encode(array(0=>'Invalid price table at line: '.implode(", ", array_diff_key(array_flip(explode("\n",$_POST['ratetable'])),array_flip($out[0])))));
exit();
}
答案 3 :(得分:0)
^\d+:\d+(\.\d{1,2})?$
在:
if(preg_match("/^\d+:\d+(\.\d{1,2})?$/", $str))
{
echo "Valid input!";
}