使用正则表达式检查字符串格式

时间:2013-12-25 19:01:57

标签: php regex preg-match

我需要检查一个带有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表达式吗?

4 个答案:

答案 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!";
}

Live demo