Php 确保字符串包含特定字符,每个字符最多一次

Php 确保字符串包含特定字符,每个字符最多一次,php,regex,Php,Regex,我想测试一个字符串是空的还是只包含特定的字符,每个字符最多一次 例如: 给定$valid='ABCDE',以下字符串为: $a = ''; // valid, empty $b = 'CE'; // valid, only contains C and E, each once $c = 'AZ'; // invalid, contains Z $d = 'DAA'; // invalid, contains A twice 使用正则表达式是否有任何快速的方法?我们可以尝试使用以下正则表达式模

我想测试一个字符串是空的还是只包含特定的字符,每个字符最多一次

例如:

给定
$valid='ABCDE'
,以下字符串为:

$a = ''; // valid, empty
$b = 'CE'; // valid, only contains C and E, each once
$c = 'AZ'; // invalid, contains Z
$d = 'DAA'; // invalid, contains A twice

使用正则表达式是否有任何快速的方法?

我们可以尝试使用以下正则表达式模式:

^(?!.*(.).*\1)[ABCDE]{0,5}$
下面是对正则表达式的解释:

^                    from the start of the string
    (?!.*(.).*\1)    assert that the same letter does not repeat
    [ABCDE]{0,5}     then match 0-5 letters
$                    end of the string
PHP脚本示例:

$input = "ABCDE";
if (preg_match("/^(?!.*(.).*\1)[ABCDE]{0,5}$/", $input)) {
    echo "MATCH";
}

负前瞻
(?!.*()..*\1)
的工作原理是检查它是否可以捕获任何单个字母,然后在以后的字符串中再次找到它。让我们接受OP的无效输入
DAA
。当匹配并捕获第一个
A
,然后再次看到它时,上面的负前瞻将发出警报。请注意,Lookaround可以有自己的捕获组。

我们可以尝试使用以下正则表达式模式:

^(?!.*(.).*\1)[ABCDE]{0,5}$
下面是对正则表达式的解释:

^                    from the start of the string
    (?!.*(.).*\1)    assert that the same letter does not repeat
    [ABCDE]{0,5}     then match 0-5 letters
$                    end of the string
PHP脚本示例:

$input = "ABCDE";
if (preg_match("/^(?!.*(.).*\1)[ABCDE]{0,5}$/", $input)) {
    echo "MATCH";
}

负前瞻
(?!.*()..*\1)
的工作原理是检查它是否可以捕获任何单个字母,然后在以后的字符串中再次找到它。让我们接受OP的无效输入
DAA
。当匹配并捕获第一个
A
,然后再次看到它时,上面的负前瞻将发出警报。请注意,lookarounds可以有自己的捕获组。

没有regex会容易得多。没有regex会容易得多。如果$valid可变更改(即它不是
ABCDE
的话)会怎么样呢?这太棒了。@Nicolas我也使用过这个演示工具(最初),它也有一些怪癖。但是,它似乎在a中起作用。您能否更详细地解释一下
(?!!()..*\1)
表达式,以及如何使用否定前瞻实现“同一个字母不会重复”。谢谢。@TimBiegeleisen您能检查一下吗:但是当我在这里测试这个模式时,它的工作原理是如果$valid varible发生了变化,那会怎么样呢?即它不是来自
ABCDE
,这太棒了。@Nicolas我(最初)也使用过这个演示工具,它也有一些怪癖。但是,它似乎在a中起作用。您能否更详细地解释一下
(?!!()..*\1)
表达式,以及如何使用否定前瞻实现“同一个字母不会重复”。谢谢。@TimBiegeleisen你能检查一下吗:但是当我在这里测试这个图案时,它工作得很好