2

我需要一个正则表达式来检查字符串是否只包含字母(az)并且第一个字母是大写的,你不能在一个单词中包含 2 个大写字母,例如:THomas 或 THomAS 但 Thomas Anderson(Thomas anderson 也是)将是有效的

看:

The Magician Of The Elfs将是有效的,但不是ThE MaGiCiAN oF ThE ELFS

if (!preg_match("??", $name)) {
   echo "Invalid name!";
}

希望你能理解!

托马斯

无效的:

MaGIciaN Of The ELFz
THomas anderson

有效的:

Magician of the elfs
Magician Of the Elfs
Magician of The elfs
Thomas Anderson
Thomas anderson

基本上我不希望一个单词中包含超过 1 个大写字母,而不是句子。

4

5 回答 5

5
'/^[A-Z][a-z]+( [A-Z][a-z]+)*$/'

不过,未经测试。

编辑哦,也许我误读了你的问题。以上假设最小字长为 2。“John A”或“A Horse”有效吗?在这种情况下:'/^[A-Z][a-z]*( [A-Z][a-z]*)*$/'


根据更新要求:

'/^[A-Z][a-z]*( [A-Za-z][a-z]*)*$/'

验证一个大写字母后跟任意数量的小写字母。在此之后,任意数量的序列:空格,(可能是大写字母),任意数量的小写字母(每个空格总共至少一个字母)。

于 2010-01-17T12:45:20.313 回答
3

您还可以通过其Unicode 字符属性来描述该字符:

/^\p{Lu}\p{Ll}*(?:\s+\p{Lu}\p{Ll}*)*$/

编辑    由于您更改了要求,请尝试以下正则表达式:

/^[\p{Lu}\p{Ll}]\p{Ll}*(?:\s+[\p{Lu}\p{Ll}]\p{Ll}*)*$/

现在第一个字符或每个单词可以是大写字母或小写字母。

于 2010-01-17T13:02:59.980 回答
1
$str = "ThE MaGiCiAN oF ThE ELFS";
$s = explode(" ",$str);
foreach ($s as $k){
    if ( ! (preg_match("/^[A-Z][a-z]+/",$k) )){
        print "$str does not match.\n";
        break;
    }
}
于 2010-01-17T13:00:04.820 回答
0

哇。\b, 伙计们。

if matches /\B[A-Z]/ then invalid

或者,要知道 Unicode,

if matches /\B\p{Lu}/ then invalid

您可能希望首先确保整个字符串匹配/^[\p{Lu}\p{Ll}\s]$/,以避免将字符串保留The (Magic) Elf为有效。

于 2010-01-17T13:36:18.283 回答
0
if (preg_match("\w[A-Z]", $name)) {
    echo "invalid name!";
}
于 2010-01-17T13:44:49.183 回答