字母之间只允许一个空格

时间:2013-12-26 15:09:45

标签: php regex

我几乎不知道关于正则表达式的任何内容,但我需要在字母之间只允许一个空格,这是我用另一个问题和答案做的,再加上用regex101随机尝试:

/^(\d){1,}(\:[A-Za-z0-9-]+([ a-zA-Z0-9-]+)?)?\:(\d){1,}(?:\.(\d){1,2})?$/m

fomat应该是:

[integer]:[optional label :][integer/decimal]

示例:

12:aaa:12.31
56:a s f:15
34:45.8

我做了一些随机尝试而没有任何成功,我只能允许无限空间,有人可以帮助我吗?我也查看了其他答案,但我无法在我的正则表达式中实现。

检查错误:

    preg_match_all('/^(\d+)(:[A-Z0-9-]+(?: [A-Z0-9-]+)*)?:(\d+(?:\.\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();
    }

5 个答案:

答案 0 :(得分:2)

你可以让正则表达式更短一点,并在每个字母之间允许一个空格,如下所示:

/^(\d+)(:[A-Z0-9-]+(?: [A-Z0-9-]+)*)?:(\d+(?:\.\d{1,2})?)$/gmi

regex101 demo

如果您只想捕获捕获中的标签(并排除:),可以使用this one

答案 1 :(得分:2)

我认为

^\d+:([^:]+:)?\d+(\.\d+)?$

可能会这样做......

这意味着:<int> + ":" + [label + ":"] + <float>其中label可以是:以外的任何内容。

答案 2 :(得分:1)

你快到了:

(?: [a-zA-Z0-9-]+)*

以上意思是:空格后面至少有一个字符组;后一组,任何次数,没有捕获

答案 3 :(得分:1)

您可以使用preg_match

$str = 'Another Example String 1_2-3';
echo $str . "<br />\n";
if (preg_match('#^(?:[\w-]+ ?)+$#', $str)){
    echo 'Legal format!';
} else {
    echo 'Illegal format!';
}

答案 4 :(得分:0)

^\d+:([\w\d]+ ?)*:?\d+(\.\d+)?$

Live demo